【Python】簡述Numpy庫常用方法和屬性


生成數組

常見的生成數組方法

import numpy as np
testdata = np.arange(16)#生成指定數量個整型元素的數組

test_data = np.full((2,3),9)#指定生成2行3列,元素全為9的數組

data1 = np.zeros(15)#生成指定數量個元素全為0的數組

data2 = np.ones(20)#生成指定數量個元素全為1的數組

data3 = np.array(data1)#從現有數組拷貝

data4 = np.copy(data3)#同上(均為深拷貝)

data5 = np.asarray(data1)#同上,但為淺拷貝,會隨原數組變化而變化

data6 = np.linspace(0,15,10)#在指定區間內生成指定數量個元素的數組

data7 = np.arange(0,11,5)#在指定區間內生成指定間隔的數組

data8 = np.random.randint(1,100,35,'i')#生成35個從1到100之間的數組成數組

data9 = np.clip(x,min,max)#從數組x中取min到max之間的數值

其中,每個方法中還有需要非必要參數,如果有需要還需查閱相關資料。

 

生成均勻分布數組

###均勻分布(在相同長度間隔的分布概率是等可能的)
import matplotlib.pyplot as plt
data9 = np.random.uniform(10,20,1000000)#從10到20之間,隨機生成1000000個數據組成均勻分布數組
print('data9:',data9)
plt.figure(figsize=(20,8),dpi=100)
plt.hist(data9,1000)
plt.show()
均勻分組

運行結果為

data9: [17.20969749 11.91751292 12.13526962 ... 12.63111667 11.86567292
 19.94391678]

 

生成正態分布數組

###正態分布
import matplotlib.pyplot as plt
data10 = np.random.normal(1.71,0.2,1000000)#生成1000000個元素為均值為1.71,方差為0.2的數組
plt.figure(figsize=(20,8),dpi=100)
plt.hist(data10,1000)
plt.show()
正態分布

運行結果為

 

ndarray屬性的用法

常用的屬性方法

array = np.array([[80,66,25,14,33],
                  [11,45,15,34,89],
                  [10,85,45,28,94],
                  [18,51,74,85,10],
                  [89,31,54,65,32],
                  [56,13,87,12,65],
                  [87,15,32,45,51],
                  [17,30,84,12,45]])
array.shape#數組的維度(行列數)

array.ndim#數組維度的個數

array.size#數組的個數

array.dtype#數組中元素的類型

array.itemsize#數組中元素的字節大小

array.data[1,2]#訪問數組中某個位置的元素

###切片索引與形狀修改
data11 = np.random.normal(1,0.21,(8,11))###生成八組正態分布數組,每個數組內有11個元素

data12 = data11.reshape(11,8)###只在原數據基礎上重新分割為指定行列,然后返回新的數組,並不影響原數組

data13 = data11.resize(11,8)###只在原數據基礎上重新分割為指定行列,改變原數組,沒有返回值

data14 = data12.T###轉置,行變成列,列變成行,不改變原數組

###改變數據類型,數組去重
data15 = np.random.uniform(1,10,(4,5))###生成四組均勻分布數組,每組內有5個元素

data16 = data15.astype('int64')###改變數組中元素類型且不改變原數組

data18 = np.random.normal(1,5,(3,5))###生成數組###生成數組
data18 = data18.astype('int32')###定義生成數組類型

data18 = np.unique(data18)###第一種去重方法

data19 = set(data18.flatten())###第二種去重方法,先變為一維數組再用set

a = np.array([1,2,3])###生成數組

np.repeat(a, [1,2,3])###repeat(數組,元素重復次數,axis改變軸)

np.tile(a, 2)###tile(數組,數組重復次數)

a = np.arange(10).reshape(2,-1)###生成數組
b = np.repeat(1, 10).reshape(2,-1)###生成數組###生成數組

np.concatenate([a, b], axis=0)###連接函數,前者為要連接的array,axis默認為0,垂直連接。若axis為1,水平連接。

np.vstack([a, b])###垂直方向拼接數組

np.r_[a, b]###不改變列數,按行拼接

np.concatenate([a, b], axis=1)###水平方向拼接數組

np.hstack([a, b])###水平方向拼接數組

np.c_[a, b]###不改變函數,按列拼接

a = np.array([1,2,3,2,3,4,3,4,9,5])###生成數組
b = np.array([7,2,10,2,7,4,9,4,9,8])###生成數組

np.intersect1d(a,b)###查找數組中相同的元素

np.setdiff1d(a,b)###刪除a中有,但b中也有的元素

np.where(a==b)###找出a和b中相同元素的位置,前提兩個數組中元素個數必須相同

np.where((a>=5)&(a<=10))###查找大於等於5並且小於等於10的元素

np.where(np.logical_and(a>=5, a<=10))###同上

arr = np.arange(9).reshape(3,3)###生成數組

arr[[2,1,0],:]###改變數組行位置

arr[:,[1,2,0]]###改變數組列位置

arr[::-1]###翻轉二維數組的行

arr[:,::-1]###翻轉二維數組的列

rand_arr = np.random.random([5,3])

np.set_printoptions(precision=3)###設置打印參數,precision可以規定打印小數點后幾位

 

邏輯運算

data20 = np.random.normal(0,0.2,(4,5))###生成平均分布數組
print('data20:',data20)
print('判斷漲幅是否大於0.1,是則True,否則False:\n',data20 > 0.1)
data20[data20 > 0.1] = 1.5###布爾索引以及操作
print('data20',data20)
print('np.all用法:',np.all(data20>0.1))###傳入一組布爾值,數組中只要有一個是False則返回False,全是True返回True
print('np.any用法:',np.any(data20>0.1))###傳入一組布爾值,數組中只要有一個是True則返回True,全是False返回False
###三元運算符np.where
print('np.where用法:',np.where(data20>0.2,1,0))###np.where(判斷條件,True值,False值)
###復合邏輯運算np.logical_and和np.logical_or
print('np.logical_and用法:',np.logical_and(data20>0,data20<0.5))###篩選大於0並且小於0.5的元素
print('np.logical_or用法:',np.logical_or(data20>0.5,data20<0.8))###篩選大於0.5或者低於0.8的元素

運行結果參考:

data20: [[ 5.812e-02 -2.305e-01 -4.702e-01  1.898e-01  8.838e-02]
 [ 1.626e-01  3.250e-03 -1.356e-01 -1.514e-01  1.343e-01]
 [-3.071e-02 -2.933e-02  1.320e-01 -1.521e-01  6.943e-02]
 [ 2.776e-01 -8.821e-05 -4.295e-02  2.106e-01  1.786e-01]]
判斷漲幅是否大於0.1,是則True,否則False:
 [[False False False  True False]
 [ True False False False  True]
 [False False  True False False]
 [ True False False  True  True]]
data20 [[ 5.812e-02 -2.305e-01 -4.702e-01  1.500e+00  8.838e-02]
 [ 1.500e+00  3.250e-03 -1.356e-01 -1.514e-01  1.500e+00]
 [-3.071e-02 -2.933e-02  1.500e+00 -1.521e-01  6.943e-02]
 [ 1.500e+00 -8.821e-05 -4.295e-02  1.500e+00  1.500e+00]]
np.all用法: False
np.any用法: True
np.where用法: [[0 0 0 1 0]
 [1 0 0 0 1]
 [0 0 1 0 0]
 [1 0 0 1 1]]
np.logical_and用法: [[ True False False False  True]
 [False  True False False False]
 [False False False False  True]
 [False False False False False]]
np.logical_or用法: [[ True  True  True  True  True]
 [ True  True  True  True  True]
 [ True  True  True  True  True]
 [ True  True  True  True  True]]

  

統計運算

temp = np.random.uniform(1,-0.5,(4,4))###生成數組
np.max(temp,axis=0)###求數組中最大值,若不加axis則求所有元素最大值,axis=0求出每列最大值,axis=1或-1求出每行最大值
np.min(temp,axis=0)###求數組中最小值,若不加axis則求所有元素最小值,axis=0求出每列最小值,axis=1或-1求出每行最小值
np.mean(temp)###求平均值
np.median(temp)###求中位數
np.var(temp)###求方差
np.std(temp)###求標准差

 

數組間運算 

###數組與數之間的運算,每個元素都與之進行運算
array = np.arange(5)
array + 1
array * 2
array / 2

###數組與數組之間的運算
###廣播機制,為了方便不同形狀的數組之間運算(當操作兩個數組時,numpy會逐個比較它們的形狀。只有在維度相同或者形狀對應位置有一個是1才能進行運算)
###能進行運算的數組
a = np.arange(6).reshape(2,3)###兩行三列
b = np.arange(2).reshape(2,1)###兩行一列
a + b###兩個數組中,分別滿足相同維度行,對應有一列為1,所以可以進行運算

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM