Numpy 學習 第五篇:數組的高級操作


數組的高級操作主要是組合數組,拆分數組,tile數組和重組元素。

一,組合數組

一維數組相當於是1行N列的數組,當使用column_stack()時,該一維數組作為一個新列;當使用hstack()函數時,為原始數組新增N列;當使用vstack()函數時,為原始數組新增1行。

1,把一維數組作為列添加到二維數組中

tup是一個數組的序列,按照列堆疊時,相當於二維數組新增一列;按照行堆疊時,相當於增加一列行:

numpy.column_stack(tup)
numpy.row_stack(tup)

舉個例子,把兩個一維數組按照行/列堆疊成一個二維數組:

>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> np.row_stack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.column_stack((a,b))
array([[1, 4],
       [2, 5],
       [3, 6]])

2,水平(按列)順序堆疊數組

按列對原始數組進水平(horizontally ,column),垂直(vertically ,row)或者深度(depth,third asix)擴展,參數tup是數組的序列:

numpy.stack(arrays, axis=0)
numpy.hstack(tup)
numpy.vstack(tup)
numpy.dstack(tup)

舉個例子,分別對數組進行列堆疊、水平堆疊和垂直堆疊:

>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])

>>> np.vstack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5, 6])
>>> np.dstack((a,b))
array([[[1, 4],
        [2, 5],
        [3, 6]]])

3,拼接數組

numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")

參數axis默認值是0,標識按照行來拼接,如果設置為None,那么所有的數組將展開為一維,並拼接在一起。

舉個例子:

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

二,vectorize 向量化和 apply函數

1,vectorize

numpy.vectorize()函數定義一個向量化函數,它以序列或numpy數組作為輸入,對numpy數組做向量化操作。函數輸出的數據類型是由otypes參數確定的,如果otypes=None,那么輸出的數據類型是通過使用輸入的第一個元素調用函數來確定的,該函數返回一個函數對象。

numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

參數注釋:

  • pyfunc:函數對象
  • otype:輸出數據的類型(putput data type)

使用vectorize()定義一個向量化函數,對數組做向量化操作:

def myfunc(a, b):
    return a-b if a>b else a+b

vfunc = np.vectorize(myfunc)
vfunc([1, 2, 3, 4], 2)
#output array([3, 4, 1, 2])

2,apply族函數

沿着特定的維度,在一維數組切片上應用函數:

numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)

舉個例子,傳遞的一維數組是列,按照列值計算兩個端點的均值:

>>> def my_func(a):
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(my_func, 0, b)
array([4., 5., 6.])

三,柵格數據

對於mgrid()函數,用於生成多維數據,參數是一個序列,常用於生成1維,2維和3維數據:

np.mgrid[ 第1維,第2維 ,第3維 , …] 

第n維的書寫形式為:

start:end:step

如果step為整數,表示間隔,左閉右開;如果step為 int + j,表示點數,左閉右閉。

對於np.meshgrid()用於生成網格型數據,接受兩個一維數組生成兩個二維矩陣,對應兩個數組中所有的(x,y)對。

np.meshgrid(x, y)

四,查找函數

1,查找最大值或最小值所在的索引

按照特定的軸查找最大值或最小值的索引

numpy.argmax(a, axis=None, out=None, *, keepdims=<no value>)
numpy.argmin(a, axis=None, out=None, *, keepdims=<no value>)

舉個例子,查找最小值的索引:

>>> a = np.arange(6).reshape(2,3) + 10
>>> a
array([[10, 11, 12],
       [13, 14, 15]])
>>> np.argmin(a)
0
>>> np.argmin(a, axis=0)
array([0, 0, 0])
>>> np.argmin(a, axis=1)
array([0, 0])

2,查找非0元素的索引

numpy.argwhere(a)

舉個例子,查找數組中大於0的元素的索引:

>>> x = np.arange(6).reshape(2,3)
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.argwhere(x>1)
array([[0, 2],
       [1, 0],
       [1, 1],
       [1, 2]])

3,查找操作

查找操作是指按照特定的條件對數組元素進行三值運算

where()函數對每一個元素執行三值運算:當滿足condition 時,返回x;否則,返回y

numpy.where(condition[, x, y])

舉個例子,對於一維數組,當元素值小於5時,返回原值;當元素值大於5時,乘以10返回:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])

4,抽取元素

返回滿足條件的數據元素,當參數condition為True,返回該位置的元素:

numpy.extract(condition, arr)

舉個例子,extract()函數和掩碼索引數組的功能相同:

>>> arr = np.arange(12).reshape((3, 4))
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> condition = np.mod(arr, 3)==0
>>> condition
array([[ True, False, False,  True],
       [False, False,  True, False],
       [False,  True, False, False]])
>>> np.extract(condition, arr)
array([0, 3, 6, 9])
If condition is boolean:

>>>
>>> arr[condition]
array([0, 3, 6, 9])

五,相關性

1,返回 Pearson 積矩相關系數

numpy.corrcoef(x, y=None, rowvar=True, *, dtype=None)

2,協方差矩陣

根據data和weight,計算協方差矩陣:

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)

計算的邏輯:

m = np.arange(10, dtype=np.float64)
f = np.arange(10) * 2
a = np.arange(10) ** 2.
ddof = 1
w = f * a
v1 = np.sum(w)
v2 = np.sum(w * a)
m -= np.sum(m * w, axis=None, keepdims=True) / v1
cov = np.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)

3,相關性

計算兩個一維序列的相關性

numpy.correlate(a, v, mode='valid')

舉個例子:

np.correlate([1, 2, 3], [0, 1, 0.5])
array([3.5])

六,統計方法

NumPy內置數據分析常用的統計量:

  • mean():計算元素的均值
  • median():計算中位數
  • var():計算元素的方差
  • std() :計算元素標准差
  • max():計算元素的最大值
  • min():計算元素的最小值
  • ptp():計算元素的取值范圍,即最大值和最小值的差值
  • percentile():計算百分位
  • quantile():計算分為數
  • count_nonzero():計數
  • cumsum:計算所有元素的累計和
  • cumprod:計算所有元素的累計積

1,求和

舉個例子,創建一個二維數組,按照行和列分別求和:

a = np.array([[0, 2, 1]
              ,[0,1,0]])

r1=a.sum()
r2=a.sum(axis=0)
r3=a.sum(axis=1)

print('a.sum() = {0}\na.sum(axis=0) = {1}\na.sum(axis=1) ={2}'.format(r1,r2,r3))

2,求積

舉個例子,創建一個二維數組,按照行和列分別求乘積:

a = np.array([[1, 2, 1]
             ,[1,1,0]])

r1=a.prod()
r2=a.prod(axis=0)
r3=a.prod(axis=1)

print('a.prod() = {0}\na.prod(axis=0) = {1}\na.prod(axis=1) ={2}'.format(r1,r2,r3))

3,計算數組的均值

計算數組的均值,或者某一個維度的均值:

a = np.array([[1, 2, 1]
             ,[1,1,0]])

r1=a.mean()
r2=a.mean(axis=0)
r3=a.mean(axis=1)

print('a.mean() = {0}\na.mean(axis=0) = {1}\na.mean(axis=1) ={2}'.format(r1,r2,r3))

4,統計非0元素的個數

作為示例,考慮只包含1和0的一維向量中,統計從0 到 1 轉換的數量,在矢量化形式中,沒有明確的for循環或直接引用各個元素:

>>> np.count_nonzero(x[:-1] < x[1:])

 

 

 

 

參考文檔:

numpy Routines


免責聲明!

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



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