numpy学习4:NumPy基本操作
一、數組與標量、數組之間的運算
數組不用循環即可對每個元素執行批量的算術運算操作,這個過程叫做矢量化,即用數組表達式代替循環的做法。
矢量化數組運算性能比純Python方式快上一兩個數據級。
大小相等的兩個數組之間的任何算術運算都會將其運算應用到元素級上的操作。
**元素級操作:**在NumPy中,大小相等的數組之間的運算,為元素級運算,即只用于位置相同的元素之間,所得的運算結果組成一個新的數組,運算結果的位置跟操作數位置相同。
1.1、數組與標量之間的運算
數組與標量之間的運算的意思是:數組和元素的運算,例如,在一個矩陣的基礎上加上一個數,得到另外一個新的矩陣。
a = np.arange(9).reshape(3,3) print("運算前:") print(a) print("加法:") print(a+2) print("減法:") print(a-2) print("乘法:") print(a*2) print("除法:") print(a/2)輸出:
運算前: [[0 1 2][3 4 5][6 7 8]] 加法: [[ 2 3 4][ 5 6 7][ 8 9 10]] 減法: [[-2 -1 0][ 1 2 3][ 4 5 6]] 乘法: [[ 0 2 4][ 6 8 10][12 14 16]] 除法: [[0. 0.5 1. ][1.5 2. 2.5][3. 3.5 4. ]]1.2、數組與數組之間的運算
'''Numpy算數運算用于執行算數運算的輸入數組必須具有相同的行列或符合數組廣播規則 ''' a = np.arange(9).reshape(3,3) b = np.array([1,3,2]) print(a) print(b) print('**************************************') #兩個數組相加 print(np.add(a,b)) print(a+b) print('**************************************') #兩個數組相減 print(a-b) print(np.subtract(a,b)) print('**************************************') #兩個數組相乘 print(a*b) print(np.multiply(a,b)) print('**************************************') print(a/b) print(np.divide(a,b)) print('**************************************')#兩個數組取冪 print(a**b) print(np.power(a,b)) print('**************************************') print()print() print('****************兩個數組取余**********************') #mod 兩個數組取余 a = np.array([10,20,30]) b = np.array([3,5,7]) print(np.mod(a,b)) print(np.remainder(a,b)) print('**************************************') print()鑒于篇幅,輸出結果就不給出了,結果也就是矩陣的基本運算的結果。
二、 數組的矩陣積(matrix product)
**矩陣:**多維數組即矩陣
**矩陣積(matrix product):**兩個二維矩陣(行和列的矩陣)滿足第一個矩陣的列數與第二個矩陣的行數相同,那么可以進行矩陣的乘法,即矩陣積,矩陣積不是元素級的運算。也稱為點積、數量積。
即對應的每一行與每一列的元素對應相乘,得到新的矩陣。
print("*"*20) arr1 = np.array([[10,6,20],[15,5,10],[12,67,20] ]) arr2 = np.array([[12.3,0.4],[24,2.4],[9.8,0.4] ]) #print(arr2) print(arr1.dot(arr2)) print('*'*20)三、 數組的索引與切片
每個矩陣都是有索引的,在行和列的方向上,都對應有索引,其實也相同于c語言或者java的數組索引類似,通過這樣的方式,我們就可以很方便的獲取部分值。
3.1、基本索引
類似于c語言或者java的數組操作
arr=np.array([[[1,2,3,4],[2,3,4,5],[3,4,5,6]],[[10,20,30,40],[20,30,40,50],[30,40,50,60]]]) print(arr[1]) print(arr[1][1]) print(arr[1][1][2])3.2、切片操作
通過在某一個維度上,更加細類度的獲取相應的元素的過程。
通過使用::,來指定獲取的元素的數量。
注意:
- 使用np.ix_()索引器
- 花式索引
**花式索引(Fancy indexing)**指的是利用整數數組進行索引的方式。
- 布爾索引
利用布爾類型的數組進行數據索引,最終返回的結果是對應索引數組中數據為True位置的值。
names = np.array(['james','lobe','tom']) scores = np.array([[98,86,55,90],[70,86,90,99],[82,55,89,86] ]) classic = np.array(['語文','數學','英語','科學']) print('lobe的成績是:') # print(names=='lobe') print(scores[names=='lobe'])print('lobe的數學成績:') # print(scores[names=='lobe',classic=='數學']) print(scores[names=='lobe'].reshape(-1,)[classic=='數學'])print('james和lobe的成績是:') print(scores[(names=='james')|(names=='lobe')])print('非james和lobe的成績') print(scores[(names!='james')&(names!='lobe')])輸出:
lobe的成績是: [[70 86 90 99]] lobe的數學成績: [86] james和lobe的成績是: [[98 86 55 90][70 86 90 99]] 非james和lobe的成績 [[82 55 89 86]]四、 數組的轉置與軸對換
數組轉置是指將shape進行重置操作,并將其值重置為原始shape元組的倒置,比如原始的shape值為:(2,3,4),那么轉置后的新元組的shape的值為: (4,3,2)f
可以通過調用數組的transpose函數或者T屬性進行數組轉置操作
'''數組轉置與軸對換 ''' arr = np.arange(100).reshape(10,10) print(arr.shape) # print(np.transpose(arr)) #print(arr.transpose()) print(arr.T)五、 通用函數:快速的元素級數組成函數
**ufunc:**numpy模塊中對ndarray中數據進行快速元素級運算的函數,也可以看做是簡單的函數(接受一個或多個標量值,并產生一個或多個標量值)的矢量化包裝器。
主要包括一元函數和二元函數
- 一元函數
- 二元函數
六、 聚合函數
聚合函數是對一組值(eg一個數組)進行操作,返回一個單一值作為結果的函數。當然聚合函數也可以指定對某個具體的軸進行數據聚合操作;常將的聚合操作有:平均值、最大值、最小值、方差等等
這些操作類似于數據庫的聚合函數,其實操作也很相似,只是應用的場景不一樣。
我們先回顧一下標準差和反差怎么計算:
-
標準差
標準差是與平均值的偏差的平方的平均值的平方根
std = sqrt(mean((x-x.mean())**2))
-
方差
方差是偏差的平方的平均值即mean(x-x.mean()**2)
七、 np.where函數
np.where函數是三元表達式x if condition else y的矢量化版本,由此,我們就很清楚這個函數的作用了。
xarr = np.array([1,2,3,4,5]) yarr = np.array([6,7,8,9,10]) condition = xarr < yarr #傳統的三元表達式 # zip 函數接受一系列可迭代對象作為參數,將對象中對應的元素打包成一個個tuple(元組), # 然后返回由這些tuples組成的list(列表) result1 = [x if c else y for (x,y,c) in zip(xarr,yarr,condition)] print(result1) result2 = np.where(condition,xarr,yarr) print(result2)**案例:**將數組中的所有異常數字替換為0,比如將NaN替換為0
arr = np.array([[1,2,np.NaN,4],[4,5,6,np.NaN],[np.inf,7,8,9],[np.inf,np.e,np.pi,4] ])print('原數組:') print(arr) #設置條件 condition = np.isnan(arr) | np.isinf(arr) print('結果:') print(np.where(condition,0,arr))八、 np.unique函數
np.unique函數的主要作用是將數組中的元素進行 去重操作(也就是只保存不重復的數據)
arr = np.array(['1','2','3','2','4','2','5','7','7']) print('原始數組:') for a in arr:print(a,end = ' ') print()print('去重數據:') arr2 = np.unique(arr) for a in arr2:print(a,end = ' ') print()輸出:
原始數組: 1 2 3 2 4 2 5 7 7 去重數據: 1 2 3 4 5 7九、排序函數
- numpy.sort()
函數返回輸入數組的排序副本
numpy.sort(a,axis,kind,order)
| axis: | 壓著它排序數組的軸,如果沒有數組會被展開,沿著最后的軸排序 |
| kind: | 默認為’quicksort’快速排序 |
| order: | 如果數組包含字段,則是要排序的字段 |
文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:cplus人工智能算法后端技術,獲取優質學習資源。
總結
以上是生活随笔為你收集整理的numpy学习4:NumPy基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy学习3:对象属性和基本数据类型
- 下一篇: pandas教程:series和data