Numpy是Python一個(gè)很重要的第三方庫杖狼,用于科學(xué)計(jì)算充石。
注:以下代碼均在jupyter qtconsole中實(shí)現(xiàn)榛臼,導(dǎo)入了%pylab
環(huán)境。
生成數(shù)據(jù)
linspace
linspace用來生成一組等間隔的數(shù)據(jù)
In [51]: %pylab # 啟用pylab模式恩静,直接導(dǎo)入了很多科學(xué)計(jì)算庫焕毫。
In [52]: a = linspace(0, 2*pi, 21)
In [53]: a
Out[53]:
array([ 0. , 0.31415927, 0.62831853, 0.9424778 , 1.25663706,
1.57079633, 1.88495559, 2.19911486, 2.51327412, 2.82743339,
3.14159265, 3.45575192, 3.76991118, 4.08407045, 4.39822972,
4.71238898, 5.02654825, 5.34070751, 5.65486678, 5.96902604,
6.28318531])
In [54]: %precision 3 # 在qtconsole中設(shè)置數(shù)據(jù)顯示精度為小數(shù)點(diǎn)后3位。若直接使用%precision即可恢復(fù)默認(rèn)精度驶乾。
Out[54]: '%.3f'
In [55]: a
Out[55]:
array([ 0. , 0.314, 0.628, 0.942, 1.257, 1.571, 1.885, 2.199,
2.513, 2.827, 3.142, 3.456, 3.77 , 4.084, 4.398, 4.712,
5.027, 5.341, 5.655, 5.969, 6.283])
ogrid
ogrid方法產(chǎn)生一系列等差數(shù)據(jù)邑飒,類似于Matlab的start:step:stop。示例如下:
In [27]: x = ogrid[0:10]
In [28]: x
Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [29]: x = ogrid[0:10:2]
In [30]: x
Out[30]: array([0, 2, 4, 6, 8])
# 小技巧:若產(chǎn)生的數(shù)組要包含末尾的數(shù)级乐,可以使用虛數(shù)符號"j"加以實(shí)現(xiàn)疙咸。
In [32]: x
Out[32]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
In [33]: x = ogrid[0:10:6j]
In [34]: x
Out[34]: array([ 0., 2., 4., 6., 8., 10.])
# 還可以直接產(chǎn)生二維數(shù)據(jù)
In [35]: x, y = ogrid[0:10:2, 10:20:6j]
In [36]: x
Out[36]:
array([[ 0.],
[ 2.],
[ 4.],
[ 6.],
[ 8.]])
In [37]: y
Out[37]: array([[ 10., 12., 14., 16., 18., 20.]])
另外,r_唇牧,c_分別產(chǎn)生行向量數(shù)據(jù)與列向量數(shù)據(jù)罕扎,使用方法與此類似聚唐。
快捷方式產(chǎn)生矩陣
ones丐重,zeros,empty杆查,identity等分別產(chǎn)生1矩陣扮惦,0矩陣,空矩陣(0矩陣)亲桦,單位矩陣(對角線為1)
顯示命名空間參數(shù)
使用who()
或者whos
即可顯示當(dāng)前命名空間參數(shù)崖蜜,如:
In [92]: who()
Name Shape Bytes Type
===========================================================
size 200 1600 float64
a 21 168 float64
b 21 168 float64
_25 (b) 21 168 float64
_29 (b) 21 168 float64
_30 21 21 bool
x 50 400 float64
_45 200 1600 float64
y 50 400 float64
_48 200 1600 float64
_50 (_45) 200 1600 float64
_51 (_48) 200 1600 float64
_53 (size) 200 1600 float64
color 200 1600 float64
t 50 400 float64
Upper bound on total bytes = 7957
In [93]: whos
Variable Type Data/Info
-------------------------------
a ndarray 21: 21 elems, type `float64`, 168 bytes
b ndarray 21: 21 elems, type `float64`, 168 bytes
color ndarray 200: 200 elems, type `float64`, 1600 bytes
size ndarray 200: 200 elems, type `float64`, 1600 bytes
t ndarray 50: 50 elems, type `float64`, 400 bytes
x ndarray 50: 50 elems, type `float64`, 400 bytes
y ndarray 50: 50 elems, type `float64`, 400 bytes
數(shù)組屬性
建立了數(shù)組a,則它的常用屬性如下:
In [162]: a = array([[1, 2, 3], [4, 5, 6]])
In [163]: a
Out[163]:
array([[1, 2, 3],
[4, 5, 6]])
1.查看類型
In [164]: type(a)
Out[164]: numpy.ndarray
2.查看數(shù)組中的數(shù)據(jù)類型
In [165]: a.dtype
Out[165]: dtype('int64')
3.查看數(shù)組中每個(gè)元素所占字節(jié)
In [166]: a.itemsize
Out[166]: 8
4.查看數(shù)組的行列數(shù)
In [167]: a.shape
Out[167]: (2, 3) # 說明是2行3列的數(shù)組
5.查看數(shù)組元素?cái)?shù)目
In [168]: a.size
Out[168]: 6 # 數(shù)組元素?cái)?shù)目等于行數(shù)與列數(shù)的乘積
6.查看數(shù)組所占空間
In [169]: a.nbytes
Out[169]: 48 # 數(shù)組所占空間為數(shù)組的itemize與size的乘積
7.查看數(shù)組維數(shù)
In [170]: a.ndim
Out[170]: 2 # 表明是二維數(shù)組
fill填充數(shù)據(jù)
fill方法將數(shù)組設(shè)置為指定值客峭。如:
In [180]: a
Out[180]:
array([[1, 2, 3],
[4, 5, 6]])
In [181]: a.fill(-4.8)
In [182]: a
Out[182]:
array([[-4, -4, -4],
[-4, -4, -4]])
注意豫领,此時(shí)a保持行列數(shù)不變,元素全部變成了-4舔琅。但是為什么不是-4.8呢等恐?那是因?yàn)榇藭r(shí)數(shù)組a的dtype為int,所以只能保留為整數(shù)备蚓】问撸可做如下更改:
In [183]: a.dtype
Out[183]: dtype('int64')
In [184]: a.dtype = 'float'
In [185]: a.dtype
Out[185]: dtype('float64')
In [186]: a.fill(-4.8)
In [187]: a
Out[187]:
array([[-4.8, -4.8, -4.8],
[-4.8, -4.8, -4.8]])
可以看到,此時(shí)a中所有元素變成了-4.8郊尝。
任意類型的數(shù)組
numpy中的數(shù)組默認(rèn)為同一類型二跋,可以是數(shù)值型,也可以是字符串型流昏,但不能是混合型扎即。但是吞获,當(dāng)使用dtype=object
時(shí),即可創(chuàng)建任意類型的數(shù)組铺遂。如:
In [398]: a = array([1, 1.2, 'hello', [10, 20, 30]], dtype=object)
In [399]: a
Out[399]: array([1, 1.2, 'hello', [10, 20, 30]], dtype=object)
In [400]: a.itemsize
Out[400]: 8
In [402]: a.dtype
Out[402]: dtype('O')
In [403]: a * 2
Out[403]: array([2, 2.4, 'hellohello', [10, 20, 30, 10, 20, 30]], dtype=object)
數(shù)據(jù)引用
切片引用
現(xiàn)有原數(shù)組a衫哥,切片引用產(chǎn)生了數(shù)組b,修改b中的元素會影響a中的元素襟锐。如:
In [248]: a = array([0, 1, 2, 3, 4])
In [249]: a
Out[249]: array([0, 1, 2, 3, 4])
In [252]: b = a[2:4]
In [253]: b
Out[253]: array([2, 3])
In [254]: b[0] = 999
In [255]: b
Out[255]: array([999, 3])
In [256]: a
Out[256]: array([ 0, 1, 999, 3, 4])
說明在numpy數(shù)組中撤逢,python并沒有為b分配新的內(nèi)存空間,而是讓b指向了a分配的內(nèi)存空間粮坞。因此蚊荣,改變b會改變a的值。
python默認(rèn)的列表就不存在此現(xiàn)象莫杈,如:
In [257]: a = [0, 1, 2, 3, 4]
In [258]: b = a[2:4]
In [259]: b
Out[259]: [2, 3]
In [260]: b[0] = 999
In [261]: b
Out[261]: [999, 3]
In [262]: a
Out[262]: [0, 1, 2, 3, 4]
若要在numpy的數(shù)組中互例,改變b不影響a的值,可以使用copy()
實(shí)現(xiàn)筝闹,如:
In [271]: a = array([0, 1, 2, 3, 4])
In [272]: b = a[2:4].copy()
In [275]: b[0] = 999
In [276]: b
Out[276]: array([999, 3])
In [277]: a
Out[277]: array([0, 1, 2, 3, 4])
數(shù)組方法
sum求和
In [8]: a
Out[8]:
array([[1, 2, 3],
[4, 5, 6]])
In [9]: sum(a)
Out[9]: 21
In [12]: a.sum()
Out[12]: 21
沿著指定維度求和
In [10]: sum(a, axis=0) # 沿著行的維度求和
Out[10]: array([5, 7, 9])
In [11]: sum(a, axis=1) # 沿著列的維度求和
Out[11]: array([ 6, 15])
In [14]: a.sum(axis=0) # 沿著第一維求和
Out[14]: array([5, 7, 9])
In [16]: a.sum(axis=1) # 沿著第二維求和
Out[16]: array([ 6, 15])
prod求積
使用方法同sum
此外媳叨,max,min关顷,mean糊秆, std,var等方法與sum方法的使用也差不多议双。
clip
將數(shù)值限制在某個(gè)范圍
In [66]: a
Out[66]:
array([[1, 2, 3],
[4, 5, 6]])
In [67]: a.clip(3, 5) # a中小于3的數(shù)變成3痘番,大于5的數(shù)變成5
Out[67]:
array([[3, 3, 3],
[4, 5, 5]])
In [68]: a
Out[68]:
array([[1, 2, 3],
[4, 5, 6]])
ptp
計(jì)算數(shù)組中最大值與最小值的差
In [68]: a
Out[68]:
array([[1, 2, 3],
[4, 5, 6]])
In [69]: a.ptp()
Out[69]: 5
In [70]: a.ptp(axis=0)
Out[70]: array([3, 3, 3])
In [71]: a.ptp(axis=1)
Out[71]: array([2, 2])
round
四舍五入,0.5的近似規(guī)則為近似到偶數(shù)值平痰。
In [78]: b = rand(10)*10
In [79]: b
Out[79]:
array([ 2.57598829, 7.69588774, 9.79707955, 7.10994638, 5.27285863,
6.50838994, 9.39987486, 4.00583049, 2.58985365, 5.69761458])
In [80]: b.round()
Out[80]: array([ 3., 8., 10., 7., 5., 7., 9., 4., 3., 6.])
In [81]: b.round(decimals=1) # 保留1位小數(shù)的近似
Out[81]: array([ 2.6, 7.7, 9.8, 7.1, 5.3, 6.5, 9.4, 4. , 2.6, 5.7])
從一列數(shù)據(jù)中抽出某個(gè)區(qū)間的數(shù)據(jù)
假設(shè)有0到100之間的100個(gè)隨機(jī)數(shù)汞舱,如何找出40到60之間的數(shù)據(jù)?
In [163]: a = floor(rand(100) * 100)
In [164]: a
Out[164]:
array([ 4., 10., 6., 33., 77., 43., 19., 74., 43., 24., 70.,
97., 25., 55., 2., 26., 21., 79., 71., 66., 9., 2.,
75., 96., 27., 32., 0., 6., 3., 24., 92., 24., 94.,
38., 34., 67., 81., 94., 55., 16., 22., 88., 76., 53.,
30., 35., 13., 7., 70., 63., 25., 29., 91., 62., 57.,
86., 77., 41., 68., 52., 1., 18., 94., 20., 60., 86.,
80., 57., 13., 87., 8., 12., 86., 75., 6., 54., 84.,
36., 34., 56., 37., 55., 85., 22., 18., 95., 8., 91.,
50., 25., 94., 60., 20., 18., 49., 18., 37., 97., 33.,
67.])
方法之一是使用searchsorted函數(shù)實(shí)現(xiàn)宗雇。searchsorted有兩個(gè)參數(shù)昂芜,第一個(gè)參數(shù)是一列一維數(shù)組,第二個(gè)參數(shù)是一系列值赔蒲,返回值相當(dāng)于保持第一個(gè)數(shù)組的排序性質(zhì)不變泌神,將第二個(gè)數(shù)組中的值插入第一個(gè)數(shù)組中的位置∴诼模看示例:
In [183]: a.sort() # 對a進(jìn)行從小到大排序
In [184]: a
Out[184]:
array([ 0., 1., 2., 2., 3., 4., 6., 6., 6., 7., 8.,
8., 9., 10., 12., 13., 13., 16., 18., 18., 18., 18.,
19., 20., 20., 21., 22., 22., 24., 24., 24., 25., 25.,
25., 26., 27., 29., 30., 32., 33., 33., 34., 34., 35.,
36., 37., 37., 38., 41., 43., 43., 49., 50., 52., 53.,
54., 55., 55., 55., 56., 57., 57., 60., 60., 62., 63.,
66., 67., 67., 68., 70., 70., 71., 74., 75., 75., 76.,
77., 77., 79., 80., 81., 84., 85., 86., 86., 86., 87.,
88., 91., 91., 92., 94., 94., 94., 94., 95., 96., 97.,
97.])
In [185]: bounds = 40, 60 # 設(shè)定邊界腻扇,下邊界為40,上邊界為60
In [186]: low_idx, high_idx = searchsorted(a, bounds) #使用searchsorted函數(shù)
In [187]: low_idx # 獲取a中下邊界40對應(yīng)的數(shù)組下標(biāo)
Out[187]: 48
In [188]: high_idx # 獲取a中上邊界60對應(yīng)的數(shù)組下標(biāo)
Out[188]: 62
In [189]: a[low_idx]
Out[189]: 41.0
In [190]: a[high_idx]
Out[190]: 60.0
In [191]: a[low_idx:high_idx] # 取得a中40到60之間的數(shù)
Out[191]:
array([ 41., 43., 43., 49., 50., 52., 53., 54., 55., 55., 55.,
56., 57., 57.])
連接數(shù)組
使用concatenate砾嫉,vstack幼苛,hstack等方法。
In [2]: x = array([[0, 1, 2], [10, 11, 12]])
In [3]: y = array([[50, 51, 52], [60, 61, 62]])
In [4]: z = concatenate((x, y)) # 沿著第一維度進(jìn)行連接
In [5]: z
Out[5]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
In [6]: vstack((x, y))
Out[6]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
In [7]: concatenate((x, y), axis=1) # 沿著第二維度進(jìn)行連接
Out[7]:
array([[ 0, 1, 2, 50, 51, 52],
[10, 11, 12, 60, 61, 62]])
In [8]: hstack((x, y))
Out[8]:
array([[ 0, 1, 2, 50, 51, 52],
[10, 11, 12, 60, 61, 62]])
扁平化數(shù)組
flatten焕刮,flat舶沿,方法將多維數(shù)組降為1維
In [10]: z
Out[10]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
In [12]: z.flatten()
Out[12]: array([ 0, 1, 2, 10, 11, 12, 50, 51, 52, 60, 61, 62])
In [20]: z # 說明flatten()不影響原數(shù)組
Out[20]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
In [22]: z.flat[:] # 使用flat方法也能實(shí)現(xiàn)
Out[22]: array([ 0, 1, 2, 10, 11, 12, 50, 51, 52, 60, 61, 62])
In [23]: z.flat # 此時(shí)返回一個(gè)迭代器
Out[23]: <numpy.flatiter at 0x7fa602180a00>
In [24]: list(z.flat)
Out[24]: [0, 1, 2, 10, 11, 12, 50, 51, 52, 60, 61, 62]
In [25]: z.ravel()
Out[25]: array([ 0, 1, 2, 10, 11, 12, 50, 51, 52, 60, 61, 62])
In [26]: z # ravel方法不影響原數(shù)組
Out[26]:
array([[ 0, 1, 2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
astype
astype實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換
In [77]: a = ones([5, 4])
In [78]: a
Out[78]:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
In [79]: a.astype(int)
Out[79]:
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
In [80]: a
Out[80]:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
In [81]: a.dtype
Out[81]: dtype('float64')
# 不能直接改變dtype進(jìn)行類型轉(zhuǎn)換
In [82]: a.dtype = 'int'
In [83]: a
Out[83]:
array([[4607182418800017408, 4607182418800017408, 4607182418800017408,
4607182418800017408],
[4607182418800017408, 4607182418800017408, 4607182418800017408,
4607182418800017408],
[4607182418800017408, 4607182418800017408, 4607182418800017408,
4607182418800017408],
[4607182418800017408, 4607182418800017408, 4607182418800017408,
4607182418800017408],
[4607182418800017408, 4607182418800017408, 4607182418800017408,
4607182418800017408]])