日常使用numpy進行數據分析的時候,通常會使用模塊提供的函數,很大程度上方便了對於數據的操作。下面介紹一些常用的數組操作函數和統計函數。
將數組變形,參數是一個tuple。注意:數組元素總數要一致。import numpy as np
arr = np.random.randint(1, 100, size=(4, 6))print(arr)>>>[[34 92 83 55 73 65] [89 51 59 52 34 3] [17 82 24 2 5 36] [48 94 60 43 2 89]]
arr1 = arr.reshape((2, 3, 4))print(arr1)>>>[[[85 32 1 52] [36 68 68 76] [ 1 36 97 6]]
[[70 30 79 95] [ 5 47 42 73] [60 92 93 36]]]2、concatenate函數
concatenate() 級聯需要注意的點:
1、級聯的參數是列表:一定要加中括號或者小括號
2、維度必須相同
3、形狀相符
4、【重點】級聯的方向默認是shape這個tuple的第一個值所代表的維度方向
5、可通過axis參數來改變級聯的方向
示例1:垂直級聯 axis=0
import numpy as np
arr1 = np.random.randint(1, 100, size=(2, 5))arr2 = np.random.randint(1, 100, size=(2, 5))arr3 = np.random.randint(1, 100, size=(2, 5))
arr = np.concatenate((arr1, arr2, arr3), axis=0)
print(arr)>>>[[92 15 64 91 52] [43 60 29 57 51] [39 35 66 49 97] [56 89 80 54 57] [41 10 76 44 51] [97 84 76 46 32]]示例2:水平級聯 axis=1
import numpy as np
arr1 = np.random.randint(1, 100, size=(2, 5))arr2 = np.random.randint(1, 100, size=(2, 5))arr3 = np.random.randint(1, 100, size=(2, 5))
arr = np.concatenate((arr1, arr2, arr3), axis=1)
print(arr)>>>[[80 26 91 43 49 32 1 80 32 46 78 65 14 62 84] [22 61 77 9 10 82 42 82 37 1 28 11 89 46 67]]3、hstack函數和vstack函數
實現跟concatenate函數一樣的功能
import numpy as np
arr1 = np.random.randint(1, 100, size=(2, 5))arr2 = np.random.randint(1, 100, size=(2, 5))arr3 = np.random.randint(1, 100, size=(2, 5))
arr = np.vstack((arr1, arr2, arr3))
print(arr)>>>[[47 70 89 32 17] [83 78 50 85 23] [ 5 51 33 68 65] [ 8 50 94 82 11] [21 17 37 42 69] [37 74 61 40 53]]示例2:hstack():水平級聯
import numpy as np
arr1 = np.random.randint(1, 100, size=(2, 5))arr2 = np.random.randint(1, 100, size=(2, 5))arr3 = np.random.randint(1, 100, size=(2, 5))
arr = np.hstack((arr1, arr2, arr3))
print(arr)
>>>[[47 77 41 94 63 28 60 80 54 12 81 68 73 96 77] [47 33 6 87 34 49 33 26 45 24 82 96 72 74 58]]4、split函數、vsplit函數和hsplit函數
np.split(ary, indices_or_sections, axis=0) indices_or_sections是需要分成幾份
vsplit函數豎直方向 axis=0
hsplit函數水平方向 axis=1
示例1:平均切分
import numpy as np
arr = np.random.randint(1,100,size=(6,5))print(arr)
>>>array([[12, 88, 38, 77, 24],[54, 71, 17, 55, 30],[36, 45, 87, 68, 25],[35, 24, 96, 9, 35],[75, 15, 13, 97, 77],[72, 81, 84, 57, 17]])
np.split(arr,indices_or_sections=2,axis=0) # 按照垂直的方向切成兩份
>>>[array([[12, 88, 38, 77, 24],[54, 71, 17, 55, 30],[36, 45, 87, 68, 25]]), array([[35, 24, 96, 9, 35], [75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])]示例2:按需求切分
import numpy as np
arr = np.random.randint(1,100,size=(6,5))print(arr)
>>>array([[12, 88, 38, 77, 24], [54, 71, 17, 55, 30], [36, 45, 87, 68, 25], [35, 24, 96, 9, 35], [75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])
np.split(arr,indices_or_sections=[1,3,4],axis=0) # 按垂直的方向在1,3,4處各分一次
>>>[array([[12, 88, 38, 77, 24]]), array([[54, 71, 17, 55, 30], [36, 45, 87, 68, 25]]), array([[35, 24, 96, 9, 35]]), array([[75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])]5、sum函數、max函數和min函數
示例1:
import numpy as np
arr = np.random.randint(1,100,size=(6,5))print(arr)
>>>array([[12, 88, 38, 77, 24], [54, 71, 17, 55, 30], [36, 45, 87, 68, 25], [35, 24, 96, 9, 35], [75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])
arr.sum()>>>1514示例2:
import numpy as np
arr = np.random.randint(1,100,size=(6,5))print(arr)
>>>array([[12, 88, 38, 77, 24], [54, 71, 17, 55, 30], [36, 45, 87, 68, 25], [35, 24, 96, 9, 35], [75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])
arr.max()97示例3:
import numpy as np
arr = np.random.randint(1,100,size=(6,5))print(arr)
>>>array([[12, 88, 38, 77, 24], [54, 71, 17, 55, 30], [36, 45, 87, 68, 25], [35, 24, 96, 9, 35], [75, 15, 13, 97, 77], [72, 81, 84, 57, 17]])
arr.min()96、prod累乘函數、power冪運算、cumsum累加函數
import numpy as np
arr = np.random.randint(1,10,size=(2,5))print(arr)
>>>[[5 5 1 4 3] [6 3 2 1 7]]
arr.prod()>>>75600
arr.prod(axis=0) # 垂直方向上累乘>>>array([30, 15, 2, 4, 21])示例2:
import numpy as np
arr1 = np.random.randint(0,10,size=(2,5))arr2 = np.random.randint(0,10,size=(1,5))display(arr1,arr2)
>>>array([[5, 0, 2, 5, 5], [3, 2, 1, 1, 8]])array([[1, 4, 9, 6, 8]])
np.power(arr1, 2) # arr1中的每一個元素都進行平方>>>array([[25, 0, 4, 25, 25], [ 9, 4, 1, 1, 64]], dtype=int32)
np.power(arr1,arr2) # arr2中的每個數都是arr1中每一行的元素的冪>>>array([[5, 0, 512, 15625, 390625], [3, 16,1, 1, 16777216]], dtype=int32)示例3:
import numpy as np
arr = np.random.randint(0,10,size=(2,5))arr>>>array([[6, 7, 4, 6, 8], [3, 7, 8, 5, 1]])
arr.cumsum() # 累加>>>array([ 6, 13, 17, 23, 31, 34, 41, 49, 54, 55], dtype=int32)示例:
import numpy as np
arr = np.random.randint(1,10,size=(2,5))print(arr)>>>[[6 9 3 6 3] [9 8 4 8 2]]
arr.mean() # 平均數>>>5.8
arr.var() # 方差>>>6.360000000000001
arr.std() # 標準差>>>2.5219040425836985注意:這些函數也都可以通過傳入參數axis來計算垂直方向或者水平方向的值8、argmax函數、argmin函數和argwhere函數
argmax函數是返回最大值的索引,argmin函數是返回最小值的索引,都可以傳入參數axis。
argwhere函數可以篩選響應條件的值返回索引
示例1:
import numpy as np
arr = np.random.randint(1,100,size=(2,5))print(arr)
>>>[[60 74 8 34 30] [92 34 11 78 37]]
arr.argmax() # 返回最大值得索引>>>5 #最大值得索引為5即第6個元素92
arr.argmax(axis=1) # 返回水平方向上最大值的索引>>>array([1, 0], dtype=int64) # 第一行最大值得索引為1即第2個元素74;第二行最大值得索引為0即第1個元素92
np.argwhere(arr>50) # 返回大於50元素的索引,運行結果共有4個值>>>array([[0, 0], [0, 1], [1, 0], [1, 3]], dtype=int64)
index = np.argwhere(arr>50)for x,y in index: # 根據索引把數據都取出來 print(arr[x,y])>>>607492789、ravel函數、median中位數函數、percentile函數
ravel函數將多維數組變成一維數組
median函數,中位數將數據從小到大排列,選取正中間的數
percentile函數是計算一個多維數組的任意百分比分位數,此處的百分位是從小到大排列
示例1:
import numpy as np
arr = np.random.randint(1,100,size=(4,5))print(arr)
>>>[[62 99 4 1 8] [53 25 41 78 13] [11 72 75 91 44] [80 49 6 15 17]]
arr1 = arr.ravel()arr1>>>array([62, 99, 4, 1, 8, 53, 25, 41, 78, 13, 11, 72, 75, 91, 44, 80, 49,6, 15, 17])
np.median(arr1) # 個數非奇數時,就計算正中間兩個數的平均值>>>42.5
np.percentile(arr1,q=50) # 從小到大排列後,計算50%分位的值>>>42.510、any函數、all函數
any函數有一個為True則為True,all函數所有都為True才為True
import numpy as np
arr = np.random.randint(0,10,size=(2,5))print(arr)
>>> # 裡面包含了0[[0 8 2 9 1] [5 3 1 7 4]]
arr.any() # 有一個為True,即為True>>>True
arr.all() # 元素中的0為FALSE,則為False>>>False11、相關性函數:
corrcoef(x[, y, rowvar, bias, ddof]) 返回皮爾遜積矩相關係數。
correlate(a,v[, mode]) 兩個一維序列的互相關。
cov(m[, y, rowvar, bias, ddof, fweights, …])給定數據和權重,估計協方差矩陣。
皮爾遜相關係數的變化範圍為-1到1。係數大於0說明呈現正相關,越接近1月說明兩者相關性越強,值為1意味著兩者可以很好的由直線方程來描述,所有的數據點都很好的落在一條直線上。係數大於0說明呈現負相關,越接近-1月說明兩者相關性越強,值為−1意味著所有的數據點都落在直線上,且隨著的增加而減少。係數的值為0意味著兩個變量之間沒有線性關係。
示例:
import numpy as np
arr1 = np.random.randint(0,50,size=10)arr2 = arr1+np.random.randint(1,10,size=10)display(arr1,arr2)
>>>array([27, 15, 29, 3, 0, 9, 32, 49, 12, 43])array([31, 19, 38, 9, 6, 16, 36, 52, 13, 45])
np.corrcoef(arr1,arr2)
>>>array([[1. , 0.9899458], [0.9899458, 1. ]])直方圖統計數據出現的頻次
示例:
import numpy as np
arr = np.random.randint(0,50,size=100)arr
>>>array([10, 23, 3, 34, 44, 9, 14, 20, 29, 45, 2, 30, 30, 31, 14, 34, 12, 26, 49, 37, 48, 19, 28, 35, 19, 38, 37, 49, 26, 3, 9, 46, 13, 17, 5, 18, 46, 27, 20, 42, 44, 2, 12, 39, 43, 6, 43, 14, 32, 33, 20, 16, 2, 36, 46, 35, 48, 26, 7, 13, 0, 25, 2, 25, 23, 48, 31, 24, 25, 27, 18, 12, 39, 26, 34, 47, 0, 16, 1, 6, 41, 47, 11, 7, 15, 32, 13, 40, 27, 3, 37, 40, 22, 1, 34, 25, 4, 32, 26, 15])
np.histogram(arr,bins=10) >>>(array([12, 7, 11, 9, 7, 14, 12, 9, 8, 11], dtype=int64), array([ 0. , 4.9, 9.8, 14.7, 19.6, 24.5, 29.4, 34.3, 39.2, 44.1, 49. ]))說明:運行出來的結果表示,在0-4.9之間出現了12次,4.9-9.8出現了7次,9.8-14.7出現了9次。。。 除了介紹的這些之外,還有非常多的函數,也比較常用,比如np.pi、np.log()、np.exp()、np.sin()、np.cos()、np.NAN、np.nanvar()、np.savetxt()、np.loadtxt()等等,可以去Numpy的官網https://www.numpy.org.cn/去完整的學習一下。