Numpy統計計算、數組比較,看這篇就夠了

  • 2019 年 10 月 11 日
  • 筆記

導讀:工欲善其事,必先利其器。此前,我們在《

作者:魏溪含 塗銘 張修鵬

01 Numpy的統計計算方法

NumPy內置了很多計算方法,其中最重要的統計方法及說明具體如下。

  • sum():計算矩陣元素的和;矩陣的計算結果為一個一維數組,需要指定行或者列。
  • mean():計算矩陣元素的平均值;矩陣的計算結果為一個一維數組,需要指定行或者列。
  • max():計算矩陣元素的最大值;矩陣的計算結果為一個一維數組,需要指定行或者列。
  • mean():計算矩陣元素的平均值。
  • median():計算矩陣元素的中位數。

需要注意的是,用於這些統計方法的數值類型必須是int或者float。

數組示例程式碼如下:

vector = numpy.array([5, 10, 15, 20])  vector.sum()  

得到的結果是50

矩陣示例程式碼如下:

matrix=  array([[ 5, 10, 15],         [20, 10, 30],         [35, 40, 45]])  matrix.sum(axis=1)  array([ 30,  60, 120])  matrix.sum(axis=0)  array([60, 60, 90])

如上述例子所示,axis = 1計算的是行的和,結果以列的形式展示。axis = 0計算的是列的和,結果以行的形式展示。

延伸學習:

官方推薦教程是不錯的入門選擇。

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

02 Numpy中的arg運算

argmax函數就是用來求一個array中最大值的下標。簡單來說,就是最大的數所對應的索引(位置)是多少。示例程式碼如下:

index2 = np.argmax([1,2,6,3,2])        #返回的是2

argmin函數可用於求一個array中最小值的下標,用法與argmax類似。示例程式碼如下:

index2 = np.argmin([1,2,6,3,2]) #返回的是0

下面我們來探索下Numpy矩陣的排序和如何使用索引,示例程式碼如下:

import numpy as np  x = np.arange(15)  print(x)    # array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])  np.random.shuffle(x)    #隨機打亂  print(x)    # array([ 8, 13, 12,  3,  9,  2, 10,  0, 11,  5, 14,  7,  1,  4,  6])  sx = np.argsort(x)    #從小到大排序,返回索引值  print(sx)    # [ 7 12  5  3 13  9 14 11  0  4  6  8  2  1 10]

這裡簡單解釋一下,第一個元素7代表的是x向量中的0的索引地址,第二個元素12代表的是x向量中的1的索引地址,其他元素以此類推。

03 FancyIndexing

要索引向量中的一個值是比較容易的,比如通過x[0]來取值。但是,如果想要更複雜地取數,比如,需要返回第3個、第5個以及第8個元素時,應該怎麼辦?示例程式碼如下:

import numpy as np  x = np.arange(15)  ind = [3,5,8]  print(x[ind]) #使用fancyindexing就可以解決這個問題

我們也可以從一維向量中構成新的二維矩陣,示例程式碼如下:

import numpy as np  x = np.arange(15)  np.random.shuffle(x)  ind = np.array([[0,2],[1,3]])  #第一行需要取x向量中索引為0的元素,以及索引為2的元素,第二行需要取x向量中索引為1的元素以及索引為3的元素  print(x)  print(x[ind])

我們來看下輸出結果很容易就能明白了:

[ 3  2  7 12  9 13 11 14 10  5  4  1  6  8  0]  [[ 3  7]   [ 2 12]]  

對於二維矩陣,我們使用fancyindexing取數也是比較容易的,示例程式碼如下:

import numpy as np  x = np.arange(16)  X = x.reshape(4,-1)  row = np.array([0,1,2])  col = np.array([1,2,3])  print(X[row,col])        #相當於取三個點,分別是(0,1),(1,2),(2,3)  print(X[1:3,col])        #相當於取第2、3行,以及需要的列

04 Numpy數組比較

Numpy有一個強大的功能是數組或矩陣的比較,數據比較之後會產生boolean值。示例程式碼如下:

import numpy as np  matrix = np.array([   [5, 10, 15],  [20, 25, 30],  [35, 40, 45]  ])  m = (matrix == 25)  print(m)

我們看到輸出的結果如下:

[[False False False]   [False  True False]   [False False False]]

下面再來看一個比較複雜的例子,示例程式碼如下:

import numpy as np  matrix = np.array([  [5, 10, 15],  [20, 25, 30],  [35, 40, 45]   ])  second_column_25 =  (matrix[:,1] == 25)  print(second_column_25)  print(matrix[second_column_25, :])

上述程式碼中,print(second_column_25)輸出的是[False, True False],首先matrix[:,1]代表的是所有的行,以及索引為1的列,即[10,25,40],最後與25進行比較,得到的就是[False, True, False]。print(matrix[second_column_25, :])代表的是返回true值的那一行數據,即 [20, 25, 30]。

注意:上述的示例是單個條件,Numpy也允許我們使用條件符來拼接多個條件,其中「&」代表的是「且」,「|」代表的是「或」。比如,vector=np.array([5,10,11,12]), equal_to_five_and_ten = (vector == 5) & (vector == 10)返回的都是false,如果是equal_to_five_or_ten = (vector == 5) | (vector == 10),則返回的是[True,True,False,False]。

比較之後,我們就可以通過np.count_nonzero(x<=3)來計算小於等於3的元素個數了,1代表True,0代表False。也可以通過np.any(x == 0),只要x中有一個元素等於0就返回True。np.all(x>0)則需要所有的元素都大於0才返回True。這一點可以幫助我們判斷x里的數據是否滿足一定的條件。