01 數組上的迭代
NumPy 包含一個迭代器對象numpy.nditer。它是一個有效的多維迭代器對象,可以用于在數組上進行迭代。數組的每個元素可使用 Python 的標準Iterator接口來訪問。
importnumpyasnp
a=np.arange(0,60,5)
a=a.reshape(3,4)
print(a)
forxinnp.nditer(a):
print(x)
[[051015]
[20253035]
[40455055]]
0
5
10
15
20
25
30
35
40
45
50
55
如果兩個數組是可廣播的,nditer組合對象能夠同時迭代它們。假設數 組a具有維度 3X4,并且存在維度為 1X4 的另一個數組b,則使用以下類型的迭代器(數組b被廣播到a的大小)。
importnumpyasnp
a=np.arange(0,60,5)
a=a.reshape(3,4)
print(a)
b=np.array([1,2,3,4],dtype=int)
print(b)
forx,yinnp.nditer([a,b]):
print(x,y)
[[051015]
[20253035]
[40455055]]
[1234]
01
52
103
154
201
252
303
354
401
452
503
554
02 數組形狀修改函數
1. ndarray.reshape
函數在不改變數據的條件下修改形狀,參數如下:
ndarray.reshape(arr, newshape, order)
importnumpyasnp
a=np.arange(8)
print(a)
b=a.reshape(4,2)
print(b)
[01234567]
[[01]
[23]
[45]
[67]]
2. ndarray.flat
函數返回數組上的一維迭代器,行為類似 Python 內建的迭代器。
importnumpyasnp
a=np.arange(0,16,2).reshape(2,4)
print(a)
#返回展開數組中的下標的對應元素
print(list(a.flat))
[[0246]
[8101214]]
[0,2,4,6,8,10,12,14]
3. ndarray.flatten
函數返回折疊為一維的數組副本,函數接受下列參數:
ndarray.flatten(order)
其中:
-
order
:‘C’ — 按行,‘F’ — 按列,‘A’ — 原順序,‘k’ —元素在內存中的出現順序。
importnumpyasnp
a=np.arange(8).reshape(2,4)
print(a)
#defaultiscolumn-major
print(a.flatten())
print(a.flatten(order='F'))
[[0123]
[4567]]
[01234567]
[04152637]
03 數組翻轉操作函數
1. numpy.transpose
函數翻轉給定數組的維度。如果可能的話它會返回一個視圖。函數接受下列參數:
numpy.transpose(arr, axes)
其中:
-
arr
:要轉置的數組 -
axes
:整數的列表,對應維度,通常所有維度都會翻轉。
importnumpyasnp
a=np.arange(24).reshape(2,3,4)
print(a)
b=np.array(np.transpose(a))
print(b)
print(b.shape)
[[[0123]
[4567]
[891011]]
[[12131415]
[16171819]
[20212223]]]
[[[012]
[416]
[820]]
[[113]
[517]
[921]]
[[214]
[618]
[1022]]
[[315]
[719]
[1123]]]
(4,3,2)
b=np.array(np.transpose(a,(1,0,2)))
print(b)
print(b.shape
[[[0123]
[12131415]]
[[4567]
[16171819]]
[[891011]
[20212223]]]
(3,2,4)
2. numpy.ndarray.T
該函數屬于ndarray類,行為類似于numpy.transpose.
importnumpyasnp
a=np.arange(12).reshape(3,4)
print(a)
print(a.T)
[[0123]
[4567]
[891011]]
[[048]
[159]
[2610]
[3711]]
3. numpy.swapaxes
函數交換數組的兩個軸。這個函數接受下列參數:
numpy.swapaxes(arr, axis1, axis2)
其中:
-
arr
:要交換其軸的輸入數組 -
axis1
:對應第一個軸的整數 -
axis2
:對應第二個軸的整數
importnumpyasnp
a=np.arange(8).reshape(2,2,2)
print(a)
print(np.swapaxes(a,2,0))
[[[01]
[23]]
[[45]
[67]]]
[[[04]
[26]]
[[15]
[37]]]
4. numpy.rollaxis
numpy.rollaxis() 函數向后滾動特定的軸,直到一個特定位置。這個函數接受三個參數:
numpy.rollaxis(arr, axis, start)
其中:
-
arr
:輸入數組 -
axis
:要向后滾動的軸,其它軸的相對位置不會改變 -
start
:默認為零,表示完整的滾動。會滾動到特定位置。
importnumpyasnp
a=np.arange(8).reshape(2,2,2)
print(a)
print(np.rollaxis(a,2))
print(np.rollaxis(a,2,1))
[[[01]
[23]]
[[45]
[67]]]
[[[02]
[46]]
[[13]
[57]]]
[[[02]
[13]]
[[46]
[57]]]
04 數組修改維度函數
1. numpy.broadcast_to
函數將數組廣播到新形狀。它在原始數組上返回只 讀視圖。它通常不連續。如果新形狀不符合 NumPy 的廣播規則,該函數可能會拋出ValueError。該函數接受以下參數:
numpy.broadcast_to(array, shape, subok)
importnumpyasnp
a=np.arange(4).reshape(1,4)
print(a)
print(np.broadcast_to(a,(4,4)))
[[0123]]
[[0123]
[0123]
[0123]
[0123]]
2. numpy.expand_dims
函數通過在指定位置插入新的軸來擴展數組形狀。該函數需要兩個參數:
numpy.expand_dims(arr, axis)
其中:
-
arr
:輸入數組 -
axis
:新軸插入的位置
importnumpyasnp
x=np.array(([1,2],[3,4]))
print(x)
y=np.expand_dims(x,axis=0)
print(y)
print(x.shape,y.shape)
y=np.expand_dims(x,axis=1)
print(y)
print(x.ndim,y.ndim)
print(x.shape,y.shape)
[[12]
[34]]
[[[12]
[34]]]
(2,2)(1,2,2)
[[[12]]
[[34]]]
23
(2,2)(2,1,2)
3. numpy.squeeze
函數從給定數組的形狀中刪除一維條目。此函數需要兩個參數。
numpy.squeeze(arr, axis)
其中:
-
arr
:輸入數組 -
axis
:整數或整數元組,用于選擇形狀中單一維度條目的子集
importnumpyasnp
x=np.arange(9).reshape(1,3,3)
print(x)
y=np.squeeze(x)
print(y)
print(x.shape,y.shape)
[[[012]
[345]
[678]]]
[[012]
[345]
[678]]
(1,3,3)(3,3)
05 數組的連接操作
NumPy中數組的連接函數主要有如下四個:
-
concatenate
沿著現存的軸連接數據序列 -
stack
沿著新軸連接數組序列 -
hstack
水平堆疊序列中的數組(列方向) -
vstack
豎直堆疊序列中的數組(行方向)
1. numpy.stack
函數沿新軸連接數組序列,需要提供以下參數:
numpy.stack(arrays, axis)
其中:
-
arrays
:相同形狀的數組序列 -
axis
:返回數組中的軸,輸入數組沿著它來堆疊
importnumpyasnp
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6],[7,8]])
print(b)
print(np.stack((a,b),0))
print(np.stack((a,b),1))
[[12]
[34]]
[[56]
[78]]
[[[12]
[34]]
[[56]
[78]]]
[[[12]
[56]]
[[34]
[78]]]
2. numpy.hstack
是numpy.stack()
函數的變體,通過堆疊來生成水平的單個數組。
importnumpyasnp
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6],[7,8]])
print(b)
print('水平堆疊:')
c=np.hstack((a,b))
print(c)
[[12]
[34]]
[[56]
[78]]
水平堆疊:
[[1256]
[3478]]
3. numpy.vstack
是numpy.stack()
函數的變體,通過堆疊來生成豎直的單個數組。
importnumpyasnp
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6],[7,8]])
print(b)
print('豎直堆疊:')
c=np.vstack((a,b))
print(c)
[[12]
[34]]
[[56]
[78]]
豎直堆疊:
[[12]
[34]
[56]
[78]]
4. numpy.concatenate
函數用于沿指定軸連接相同形狀的兩個或多個數組。該函數接受以下參數。
numpy.concatenate((a1, a2, …), axis)
其中:
-
a1, a2, ...
:相同類型的數組序列 -
axis
:沿著它連接數組的軸,默認為 0
importnumpyasnp
a=np.array([[1,2],[3,4]])
print(a)
b=np.array([[5,6],[7,8]])
print(b)
print(np.concatenate((a,b)))
print(np.concatenate((a,b),axis=1))
[[12]
[34]]
[[56]
[78]]
[[12]
[34]
[56]
[78]]
[[1256]
[3478]]
06 數組的分割操作
NumPy中數組的數組分割函數主要如下:
-
split
將一個數組分割為多個子數組 -
hsplit
將一個數組水平分割為多個子數組(按列) -
vsplit
將一個數組豎直分割為多個子數組(按行)
1. numpy.split
該函數沿特定的軸將數組分割為子數組。函數接受三個參數:
numpy.split(ary, indices_or_sections, axis)
其中:
-
ary
:被分割的輸入數組 -
indices_or_sections
:可以是整數,表明要從輸入數組創建的,等大小的子數組的數量。如果此參數是一維數組,則其元素表明要創建新子數組的點。 -
axis
:默認為 0
importnumpyasnp
a=np.arange(9)
print(a)
print('將數組分為三個大小相等的子數組:')
b=np.split(a,3)
print(b)
print('將數組在一維數組中表明的位置分割:')
b=np.split(a,[4,7])
print(b)
[012345678]
將數組分為三個大小相等的子數組:
[array([0,1,2]),
array([3,4,5]),
array([6,7,8])]
將數組在一維數組中表明的位置分割:
[array([0,1,2,3]),
array([4,5,6]),
array([7,8])]
2. numpy.hsplit
split()
函數的特例,其中軸為 1 表示水平分割。
importnumpyasnp
a=np.arange(16).reshape(4,4)
print(a)
print('水平分割:')
b=np.hsplit(a,2)
print(b)
[[0123]
[4567]
[891011]
[12131415]]
水平分割:
[array([[0,1],
[4,5],
[8,9],
[12,13]]),
array([[2,3],
[6,7],
[10,11],
[14,15]])]
3. numpy.vsplit
split()
函數的特例,其中軸為 0 表示豎直分割,無論輸入數組的維度是什么。
importnumpyasnp
a=np.arange(16).reshape(4,4)
print(a)
print('豎直分割:')
b=np.vsplit(a,2)
print(b)
[[0123]
[4567]
[891011]
[12131415]]
豎直分割:
[array([[0,1,2,3],
[4,5,6,7]]),
array([[8,9,10,11],
[12,13,14,15]])]
07 數組元素操作
NumPy中數組操作函數主要如下:
-
resize
返回指定形狀的新數組 -
append
將值添加到數組末尾 -
insert
沿指定軸將值插入到指定下標之前 -
delete
返回刪掉某個軸的子數組的新數組 -
unique
尋找數組內的唯一元素
1. numpy.resize
函數返回指定大小的新數組。如果新大小大于原始大小,則包含原始數組中的元素的重復副本。如果小于則去掉原始數組的部分數據。該函數接受以下參數:
numpy.resize(arr, shape)
其中:
-
arr
:要修改大小的輸入數組 -
shape
:返回數組的新形狀
importnumpyasnp
a=np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape)
b=np.resize(a,(3,2))
print(b)
print(b.shape)
print('修改第二個數組的大?。?)
b=np.resize(a,(3,3))
print(b)
print('修改第三個數組的大?。?)
b=np.resize(a,(2,2))
print(b)
[[123]
[456]]
(2,3)
[[12]
[34]
[56]]
(3,2)
修改第二個數組的大?。?[[123]
[456]
[123]]
修改第三個數組的大?。?[[12]
[34]]
2. numpy.append
函數在輸入數組的末尾添加值。附加操作不是原地的,而是分配新的數組。此外,輸入數組的維度必須匹配否則將生成ValueError。函數接受下列函數:
numpy.append(arr, values, axis)
其中:
-
arr
:輸入數組 -
values
:要向arr添加的值,比如和arr形狀相同(除了要添加的軸) -
axis
:沿著它完成操作的軸。如果沒有提供,兩個參數都會被展開。
importnumpyasnp
a=np.array([[1,2,3],[4,5,6]])
print(a)
print(np.append(a,[[7,8,9]],axis=0))
print(np.append(a,[[5,5,5],[7,8,9]],axis=1))
[[123]
[456]]
[[123]
[456]
[789]]
[[123555]
[456789]]
3. numpy.insert
函數在給定索引之前,沿給定軸在輸入數組中插入值。如果值的類型轉換為要插入,則它與輸入數組不同。插入沒有原地的,函數會返回一個新數組。此外,如果未提供軸,則輸入數組會被展開。
insert()函數接受以下參數:
numpy.insert(arr, obj, values, axis)
其中:
-
arr
:輸入數組 -
obj
:在其之前插入值的索引 -
values
:要插入的值 -
axis
:沿著它插入的軸
importnumpyasnp
a=np.array([[1,2],[3,4],[5,6]])
print(a)
print(np.insert(a,3,[11,12]))
print(np.insert(a,1,[11],axis=0))
print(np.insert(a,1,[11],axis=1))
[[12]
[34]
[56]]
[1231112456]
[[12]
[1111]
[34]
[56]]
[[1112]
[3114]
[5116]]
4. numpy.delete
函數返回從輸入數組中刪除指定子數組的新數組。與insert()函數的情況一樣,如果未提供軸參數,則輸入數組將展開。該函 數接受以下參數:
Numpy.delete(arr, obj, axis)
其中:
-
arr
:輸入數組 -
obj
:可以被切片,整數或者整數數組,表明要從輸入數組刪除的子數組 -
axis
:沿著它刪除給定子數組的軸
importnumpyasnp
a=np.array([[1,2],[3,4],[5,6]])
print(a)
print(np.delete(a,5))
print(np.delete(a,1,axis=1))
[[12]
[34]
[56]]
[12345]
[[1]
[3]
[5]]
5. numpy.unique
函數返回輸入數組中的去重元素數組。該函數能夠返回一個元組,包含去重數組和相關索引的數組。索引的性質取決于函數調用中返回參數的類型。
numpy.unique(arr, return_index, return_inverse, return_counts)
其中:
? arr
:輸入數組,如果不是一維數組則會展開? return_index
:如果為true,返回輸入數組中的元素下標? return_inverse
:如果為true,返回去重數組的下標,它可以用于重構輸入數組? return_counts
:如果為true,返回去重數組中的元素在原數組中的出現次數
importnumpyasnp
a=np.array([5,2,6,2,7,5,6,8,2,9])
u=np.unique(a)
print(u)
u,indices=np.unique(a,return_index=True)
print(u,indices)
u,indices=np.unique(a,return_inverse=True)
print(u,indices)
u,indices=np.unique(a,return_counts=True)
print(u,indices)
[256789][256789]
[102479][256789]
[1020312405][256789]
[322111]
08 NumPy - 字符串函數
以下函數用于對dtype為numpy.string_或numpy.unicode_的數組執行向量 化字符串操作。它們基于 Python 內置庫中的標準字符串函數。字符數組類(numpy.char)中定義
![d5dc1ce8-06a3-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/D9/wKgaomTnDVqAMMjYAANlZyKxScU788.png)
importnumpyasnp
print(np.char.add(['hello'],['xyz']))
print(np.char.add(['hello','hi'],['abc','xyz']))
print(np.char.multiply('Hello',3))
print(np.char.center('hello',20,fillchar='*'))
print(np.char.capitalize('helloworld'))
print(np.char.title('hellohowareyou?'))
print(np.char.lower(['HELLO','WORLD']))
print(np.char.lower('HELLO'))
print(np.char.upper('hello'))
print(np.char.upper(['hello','world']))
print(np.char.split('hellohowareyou?'))
print(np.char.split('YiibaiPoint,Hyderabad,Telangana',sep=','))
print(np.char.splitlines('hello
howareyou?'))
print(np.char.splitlines('hello
howareyou?'))
print(np.char.strip('ashokarora','a'))
print(np.char.strip(['arora','admin','java'],'a'))
print(np.char.join(':','dmy'))
print(np.char.join([':','-'],['dmy','ymd']))
print(np.char.replace('Heisagoodboy','is','was'))
a=np.char.encode('hello','cp500')
print(a)
print(np.char.decode(a,'cp500'))
['helloxyz']
['helloabc''hixyz']
HelloHelloHello
*******hello********
Helloworld
HelloHowAreYou?
['hello''world']
hello
HELLO
['HELLO''WORLD']
['hello','how','are','you?']
['YiibaiPoint','Hyderabad','Telangana']
['hello','howareyou?']
['hello','howareyou?']
shokaror
['ror''dmin''jav']
dy
['dy''y-m-d']
Hewasagoodboy
b'x88x85x93x93x96'
hello
09 NumPy - 算數函數
NumPy 包含大量的各種數學運算功能。NumPy 提供標準的三角函數,算術運算的函數,復數處理函數等。
- 三角函數
- 舍入函數
- 算數函數
1. NumPy -三角函數
NumPy 擁有標準的三角函數,它為弧度制單位的給定角度返回三角函 數比值。arcsin,arccos,和arctan函數返回給定角度的sin,cos和tan的反三角函數。這些函數的結果可以通過 numpy.degrees()
函數通過將弧度制 轉換為角度制來驗證。
importnumpyasnp
a=np.array([0,30,45,60,90])
#通過乘pi/180轉化為弧度
print(np.sin(a*np.pi/180))
print(np.cos(a*np.pi/180))
print(np.tan(a*np.pi/180))
[0.0.50.707106780.86602541.]
[1.00000000e+008.66025404e-017.07106781e-015.00000000e-01
6.12323400e-17]
[0.00000000e+005.77350269e-011.00000000e+001.73205081e+00
1.63312394e+16]
2. NumPy -舍入函數
-
numpy.around()
這個函數返回四舍五入到所需精度的值- numpy.around(a,decimals) – a 輸入數組
- decimals 要舍入的小數位數。默認值為0。如果為負,整數將四舍五入到小數點左側的位置
-
numpy.floor()
函數返回不大于輸入參數的最大整數。 -
numpy.ceil()
函數返回輸入值的上限,大于輸入參數的最小整數
importnumpyasnp
a=np.array([1.0,5.55,123,0.567,25.532])
print(np.around(a))
print(np.around(a,decimals=1))
print(np.floor(a))
print(np.ceil(a))
[1.6.123.1.26.]
[1.5.6123.0.625.5]
[1.5.123.0.25.]
[1.6.123.1.26.]
3. NumPy - 算數運算
用于執行算術運算(如add(),subtract(),multiply()和divide())的輸入數組必須具有相同的形狀或符合數組廣播規則。
-
numpy.reciprocal()
函數返回參數逐元素的倒數。 -
numpy.power()
函數將第一個輸入數組中的元素作為底數,計算它與第二個輸入數組中相應元素的冪。 -
numpy.mod()
函數返回輸入數組中相應元素的除法余數
importnumpyasnp
a=np.array([0.25,2,1,0.2,100])
print(np.reciprocal(a))
print(np.power(a,2))
a=np.array([10,20,30])
b=np.array([3,5,7])
print(np.mod(a,b))
[4.0.51.5.0.01]
[6.25000000e-024.00000000e+001.00000000e+00
4.00000000e-02.1.00000000e+04]
[102]
4. NumPy - 統計函數
NumPy 有很多有用的統計函數,用于從數組中給定的元素中查找最小,最大,百分標準差和方差等。
-
numpy.amin() , numpy.amax()
從給定數組中的元素沿指定軸返回最小值和最大值。 -
numpy.ptp()
函數返回沿軸的值的范圍(最大值 - 最小值)。 -
numpy.percentile()
表示小于這個值得觀察值占某個百分比 -
numpy.percentile(a, q, axis)
- a 輸入數組;
- q 要計算的百分位數,在 0 ~ 100 之間;
- axis 沿著它計算百分位數的軸
-
numpy.median()
返回數據樣本的中位數。 -
numpy.mean()
沿軸返回數組中元素的算術平均值。 -
numpy.average()
返回由每個分量乘以反映其重要性的因子得到的加權平均值
importnumpyasnp
a=np.array([[3,7,5],[8,4,3],[2,4,9]])
print(np.amin(a,1))
print(np.amax(a,1))
print(np.ptp(a))
print(np.percentile(a,50))
print(np.median(a))
print(np.mean(a))
print(np.average(a))
print(np.std([1,2,3,4]))#返回數組標準差
print(np.var([1,2,3,4]))#返回數組方差
[332]
[789]
7
4.0
4.0
5.0
5.0
1.11803398875
1.25
10 排序、搜索和計數函數
NumPy中提供了各種排序相關功能。
-
numpy.sort()
函數返回輸入數組的排序副本。numpy.sort(a, axis, kind, order)- a 要排序的數組;
- axis 沿著它排序數組的軸,如果沒有數組會被展開,沿著最后的軸排序;
- kind 默認為'quicksort'(快速排序);
- order 如果數組包含字段,則是要排序的字段
-
numpy.argsort()
函數對輸入數組沿給定軸執行間接排序,并使用指定排序類型返回數據的索引數組。這個索引數組用于構造排序后的數組。 -
numpy.lexsort()
函數使用鍵序列執行間接排序。鍵可以看作是電子表格中的一列。該函數返回一個索引數組,使用它可以獲得排序數據。注意,最后一個鍵恰好是 sort 的主鍵。 -
numpy.argmax() 和 numpy.argmin()
這兩個函數分別沿給定軸返回最大和最小元素的索引。 -
numpy.nonzero()
函數返回輸入數組中非零元素的索引。 -
numpy.where()
函數返回輸入數組中滿足給定條件的元素的索引。 -
numpy.extract()
函數返回滿足任何條件的元素。
importnumpyasnp
a=np.array([[3,7,3,1],[9,7,8,7]])
print(np.sort(a))
print(np.argsort(a))
print(np.argmax(a))
print(np.argmin(a))
print(np.nonzero(a))
print(np.where(a>3))
nm=('raju','anil','ravi','amar')
dv=('f.y.','s.y.','s.y.','f.y.')
print(np.lexsort((dv,nm)))
[[1337]
[7789]]
[[3021]
[1320]]
4
3
(array([0,0,0,0,1,1,1,1],dtype=int64),
array([0,1,2,3,0,1,2,3],dtype=int64))
(array([0,1,1,1,1],dtype=int64),
array([1,0,1,2,3],dtype=int64))
[3102]
11 IO文件操作
ndarray對象可以保存到磁盤文件并從磁盤文件加載??捎玫?IO 功能有:
-
numpy.save()
文件將輸入數組存儲在具有npy擴展名的磁盤文件中。 -
numpy.load()
從npy文件中重建數組。 -
numpy.savetxt()和numpy.loadtxt()
函數以簡單文本文件格式存儲和獲取數組數據。
importnumpyasnp
a=np.array([1,2,3,4,5])
np.save('outfile',a)
b=np.load('outfile.npy')
print(b)
a=np.array([1,2,3,4,5])
np.savetxt('out.txt',a)
b=np.loadtxt('out.txt')
print(b)
[12345]
[1.2.3.4.5.]
審核編輯:湯梓紅
-
函數
+關注
關注
3文章
4346瀏覽量
62978 -
python
+關注
關注
56文章
4807瀏覽量
85040 -
迭代器
+關注
關注
0文章
44瀏覽量
4347
原文標題:詳細總結了 11 種 Numpy 的高級操作
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Python中NumPy擴展包簡介及案例詳解
基于python的numpy深度解析
![基于python的<b class='flag-5'>numpy</b>深度解析](https://file.elecfans.com/web1/M00/45/4E/pIYBAFpoILuAOhMXAAATalEGjPM002.png)
圖文詳解NumPy看這一篇就夠了
![圖文<b class='flag-5'>詳解</b><b class='flag-5'>NumPy</b>看這<b class='flag-5'>一</b>篇就夠了](https://file.elecfans.com/web1/M00/F1/3B/pIYBAGCtqXmAVHVHAAAOH9JI-z0782.png)
評論