NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫端朵,支持大量的維度數(shù)組與矩陣運算轧苫,此外也針對數(shù)組運算提供大量的數(shù)學函數(shù)庫仇冯。
NumPy 是一個運行速度非逞诖保快的數(shù)學庫浮禾,主要用于數(shù)組計算,包含:
- 一個強大的N維數(shù)組對象 ndarray
- 廣播功能函數(shù)
- 整合 C/C++/Fortran 代碼的工具
- 線性代數(shù)尺借、傅里葉變換绊起、隨機數(shù)生成等功能
一、Numpy安裝
使用pip
工具安裝
python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
--user
選項可以設(shè)置只安裝在當前的用戶下燎斩,而不是寫入到系統(tǒng)目錄虱歪。
Linux
下安裝
Ubuntu & Debian
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
CentOS/Fedora
sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel
Mac
系統(tǒng)
Mac
系統(tǒng)的 Homebrew
不包含 NumPy
或其他一些科學計算包,所以可以使用以下方式來安裝:
python -m pip install numpy scipy matplotlib
驗證是否成功:
? ~ python3
Python 3.6.5 (default, May 28 2018, 22:41:59)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
1栅表、Numpy數(shù)據(jù)類型
NumPy支持比Python更多種類的數(shù)值類型笋鄙。下表列出了NumPy中定義的不同數(shù)據(jù)類型。
數(shù)據(jù)類型 | 描述 |
---|---|
boo_ | 存儲一個字節(jié)的布爾值(true or false) |
int_ | 默認整數(shù)怪瓶,相當于 C 的long萧落,通常為int32或int64 |
intc | 相當于 C int,通常為int32或int64 |
intp | 用于索引的整數(shù)洗贰,相當于 C 的size_t找岖,通常為int32或int64 |
int8 | 1個字節(jié)(-128 ~ 127) |
int16 | 16 位整數(shù)(-32768 ~ 32767) |
int32 | 32 位整數(shù)(-2147483648 ~ 2147483647) |
int64 | 64 位整數(shù)(-9223372036854775808 ~ 9223372036854775807) |
uint8 | 8 位無符號整數(shù)(0 ~ 255) |
uint16 | 16 位無符號整數(shù)(0 ~ 65535) |
uint32 | 32 位無符號整數(shù)(0 ~ 4294967295) |
uint64 | 64 位無符號整數(shù)(0 ~ 18446744073709551615) |
float_ | float64的簡寫 |
float16 | 半精度浮點:符號位,5 位指數(shù)敛滋,10 位尾數(shù) |
float64 | 雙精度浮點:符號位许布,11 位指數(shù),52 位尾數(shù) |
complex_ | complex128的簡寫 |
complex64 | 復數(shù)绎晃,由兩個 32 位浮點表示(實部和虛部) |
complex128 | 復數(shù)蜜唾,由兩個 64 位浮點表示(實部和虛部) |
complex256 | 復數(shù)杂曲,128位 |
object | Python對象類型 |
string_ | 修正的ASCII字符串類型 |
unicode_ | 修正的Unicode類型 |
小技巧:int8,int16袁余,int32擎勘,int64 可替換為等價的字符串 'i1','i2'泌霍,'i4'货抄,其他類型也有類似的縮寫。
np.astype
顯式地轉(zhuǎn)換數(shù)據(jù)類型
Numpy
還有一些預先定義的特殊值:
比如:np.nan
朱转、np.pi
蟹地、np.e
np.nan
: 缺失值,或者理解為'不是一個數(shù)'
np.pi
:圓周率 3.1415926...
np.e
:自然數(shù)e 2.718281828459045...
一藤为、Numpy 數(shù)組
1怪与、數(shù)組創(chuàng)建
1).使用array方法。使用Python列表或者原則作為參數(shù)如:
a1 = np.array([2,3,4])
a2 = np.array((1,23,3))
數(shù)組的類型將根據(jù)序列中元素的類型推導出來缅疟。同時array
自動將二維或三維序列轉(zhuǎn)換為對應(yīng)的二維或者三維數(shù)組分别。
Numpy
數(shù)組被創(chuàng)建時也可以制定數(shù)據(jù)的類型如:
c = np.array([2,3,4], dtype=complex)
我們也可以創(chuàng)建一個都是0的數(shù)組或者都是1的數(shù)組例如:
使用zero
創(chuàng)建一個都是0的數(shù)組:
b1 = np.zeros((3,4))
b = np.zeros((5,), dtype=np.float)
創(chuàng)建一個全部為1的數(shù)組
np.ones((2,3,4), dtype=np.int16) # 制定類型
創(chuàng)建一個為空的數(shù)組:
np.empty((2,3))
可能返回未初始化的垃圾數(shù)值,不安全
創(chuàng)建一個全有8組成的數(shù)組:
np.full((3,4), 8)
2). 返回array
序列函數(shù)
使用arange
返回array
序列函數(shù):np.arange(start, stop, step, dtype)
使用linspace
函數(shù):np.linspace(start, stop, num. endpoint, retstep, dtyp)
備注:arange
浮點會有精度問題存淫,可以使用linspace
耘斩。
更多類似的函數(shù)有:array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile
。
2桅咆、數(shù)組運算
對數(shù)組進行算術(shù)運算括授,就會對整個數(shù)組的所有元祖進行逐一運算,并將運算結(jié)果保存在一個新數(shù)組內(nèi)岩饼,不破壞原始數(shù)組荚虚。
>>> a = np.array([20,30,40,50])
>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])
>>> c = a+b
>>> c
array([20, 31, 42, 53])
>>> b**2
array([0, 1, 4, 9])
>>> np.sin(a)
array([ 0.91294525, -0.98803162, 0.74511316, -0.26237485])
計算矩陣乘法:使用@
或者dot(),如
>>> A = np.array([[1,1], [0,1]])
>>> B = np.array([[2,0], [3,4]])
>>> A @ B
array([[5, 4],
[3, 4]])
>>> A.dot(B)
array([[5, 4],
[3, 4]])
對于+=
和 *=
這一類操作符,會修改原始的數(shù)組籍茧,而不是新建一個版述。
3、通用函數(shù)
函數(shù)名 | 描述 |
---|---|
abs | 逐個元素進行絕對值計算 |
fabs | 復試的絕對值計算 |
sqrt | 平方根 |
square | 平方 |
exp | 自然指數(shù)函數(shù) |
log | 以e為底的對數(shù) |
log10 | 以10為底的對數(shù) |
log2 | 以2為底的對數(shù) |
sign | 計算每個元素的符號值 |
ceil | 計算每個元素的最高整數(shù)值 |
floor | 計算每個元素的最小整數(shù)值 |
rint | 保留到整數(shù)位 |
modf | 分別將元素的小數(shù)部分和整數(shù)部分按數(shù)組形式返回 |
isnan | 判斷每個元素是否為NaN,返回布爾值 |
isfinite | 返回數(shù)組中的元素是否有限 |
isinf | 返回數(shù)組中的元素是否無限 |
cos | 余弦 |
sin | 正弦 |
tan | 正切 |
arccos | 反余弦 |
arcsin | 反正弦 |
arctan | 反正切 |
下面是部分二元通用函數(shù):
函數(shù)名 | 描述 |
---|---|
add | 將數(shù)組的對應(yīng)元素相加 |
subtract | 在第二個數(shù)組中寞冯,將第一個數(shù)組中包含的元素去除 |
multiply | 將數(shù)組的對應(yīng)元素相乘 |
divide | 相除 |
floor_divide | 整除渴析,放棄余數(shù) |
power | 冪函數(shù) |
maxium | 逐個元素計算最大值 |
minimum | 逐個元素計算最小值 |
mod | 按元素進行求模運算 |
4、索引切片迭代
Numpy的切片操作吮龄,默認是修改原數(shù)組的檬某,而不是原生Python那樣,以復制為主螟蝙。
>>> a = np.arange(10)**3
>>> a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2]
array([ 0, 8, 64])
>>> a[:6:2]=-1000
>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512,
729])
>>> a[::-1]
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1,
-1000])
5、添加刪除去重
下面是幾個常見的數(shù)組操作:
- append:將值添加到數(shù)組末尾
- insert: 沿指定軸將值插入到指定下標之前
- delete: 返回刪掉某個軸的子數(shù)組的新數(shù)組
- unique: 尋找數(shù)組內(nèi)的唯一元素
6民傻、形狀變換
可以通過數(shù)組的shape屬性胰默,查看它的形狀场斑,reshape方法不會修改數(shù)組本身,resize則正好相反:
7牵署、堆積數(shù)組
可以在不同的軸上堆積數(shù)組:
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[7., 4.],
[8., 8.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[3., 0.],
[0., 1.]])
>>> np.vstack((a,b))
array([[7., 4.],
[8., 8.],
[3., 0.],
[0., 1.]])
>>> np.hstack((a,b))
array([[7., 4., 3., 0.],
[8., 8., 0., 1.]])
>>> np.column_stack((a,b))
array([[7., 4., 3., 0.],
[8., 8., 0., 1.]])
8漏隐、分割數(shù)組
使用hsplit,可以沿著數(shù)組的水平軸拆分數(shù)組奴迅,方法是指定要返回的相等形狀數(shù)組的數(shù)目青责,或者指定在其后面進行拆分的列:
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.],
[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]])
>>> np.hsplit(a,3)
[array([[3., 3., 9., 3.],
[8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
[0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
[9., 0., 8., 9.]])]
>>> np.hsplit(a, (3,4))
[array([[3., 3., 9.],
[8., 1., 4.]]), array([[3.],
[0.]]), array([[3., 1., 6., 5., 2., 2., 3., 5.],
[0., 1., 5., 9., 9., 0., 8., 9.]])]
>>> np.array_split(a,3)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=0)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=1)
[array([[3., 3., 9., 3.],
[8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
[0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
[9., 0., 8., 9.]])]
9、視圖和復制
在操作或變換數(shù)組的時候取具,有時候會修改數(shù)組本身脖隶,有時候又不會,具體分為下面三種情況:
- 完全不復制
- view視圖(view)
- 深度拷貝(copy)
10暇检、統(tǒng)計方法
方法 | 說明 |
---|---|
sum | 求和 |
mean | 算術(shù)平均數(shù) |
std | 標準差 |
var | 方差 |
min | 最小值 |
max | 最大值 |
argmax | 最大元素在指定軸上的索引 |
argmin | 最小元素在指定軸上的索引 |
cumsum | 累積的和 |
cumprod | 累積的乘積 |
11产阱、隨機數(shù)
numpy 帶一個random模塊,下表是部分函數(shù):
函數(shù) | 功能 |
---|---|
random | 返回一個區(qū)間[0.0, 1.0)中的隨機函數(shù) |
seed | 向隨機數(shù)生成器傳遞隨機狀態(tài)種子 |
permutation | 返回一個序列的隨機排列块仆,或者返回一個亂序的整數(shù)范圍序列 |
shuffle | 隨機排列一個序列 |
rand | 從均勻分布中抽取樣本 |
randint | 根據(jù)給定的有低到高的范圍抽取隨機整數(shù) |
randn | 從均值0构蹬,方差1的正態(tài)分布中抽取樣本 |
normal | 從正態(tài)分布中抽取樣本 |
beta | 從beta分布中抽取樣本 |
gamma | 從伽馬分布中抽取樣本 |
uniform | 從均勻[0, 1)中抽取樣本 |
... | ... |