NumPy 學習 第四篇:數組的基本操作


在數組中,用axis(軸)表示維度,對於三維數組,axis參數的取值通常有:

  • 當axis=None時,表示把數組展開為一維數組;
  • 當axis=0時,表示按照行(第一維)進行計算;
  • 當axis=1時,表示按照列(第二維)進行計算;
  • 當axis=2時,表示按照第三維度進行計算。

對NumPy的數組進行操作 ,可以修改數組的元素,對元素進行滾動,轉置數組,和其他數組進行組合。

一,修改元素

數組元素的刪除,追加和插入:

numpy.delete(arr, obj, axis=None)
numpy.append(arr, values, axis=None) numpy.insert(arr, obj, values, axis=None)

參數注釋:

obj是slice,是元素的索引

  • 當要刪除單個元素時:對於一維數組,是一個標量;對於二維數組,是一個數組。
  • 要刪除多個元素時:索引數組

舉個例子,對於二維數組arr,axis=0表示按照行來刪除,指定行的索引是1,表示把第二行(5,6,7,8)刪除

>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> np.delete(arr, 1, 0) array([[ 1, 2, 3, 4], [ 9, 10, 11, 12]])

二,元素滾動

把數組中的元組滾動指定的偏移,在滾動時,首尾是相連的:

numpy.roll(a, shift, axis=None)

舉個例子,把數組向后滾動兩個偏移,把數組向前滾動兩個偏移:

>>> x = np.arange(10)
>>> np.roll(x, 2) array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7]) >>> np.roll(x, -2) array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

三,類轉置操作

數組的轉置(Transpose)通過ndarray的屬性T來獲取:

>>> x = np.array([[1.,2.],[3.,4.]])
>>> x array([[ 1., 2.], [ 3., 4.]]) >>> x.T array([[ 1., 3.], [ 2., 4.]])

1,轉置函數

變換數組的維度,對於二維數組,轉置是把行坐標和列坐標互換:

numpy.transpose(a, axes=None)

對於多維數組,轉置需要指定新轉換的維度,比如,對於三維數組,用0、1、2表示各個維度,(1,0,2)表示:把列維度變換為行維度,把行維度變化為列維度,第三維度不變。

>>> x = np.ones((1, 2, 3))
>>> np.transpose(x, (1, 0, 2)).shape (2, 1, 3)

2,互換維度

把數組的兩個維度互換

numpy.swapaxes(a, axis1, axis2)

四,組合數組

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

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

tup是一個列,相當於二維數組新增一列:

numpy.column_stack(tup)

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

按列對原始數組進行擴展,tup中的每一列都作為原始數組的一列:

numpy.hstack(tup)

3,垂直(按行)順序堆疊數組

按行對原始數組進行擴展,tup中的每一行都作為原始數組的一行:

numpy.vstack(tup)

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

>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4)) >>> np.column_stack((a,b)) array([[1, 2], [2, 3], [3, 4]]) >>> np.hstack((a,b)) array([1, 2, 3, 2, 3, 4]) >>> np.vstack((a,b)) array([[1, 2, 3], [2, 3, 4]])

五,排序和條件邏輯

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

1,排序函數

sort(axis,kind)函數用於對數組進行排序,可以使用類方法numpy.sort(),返回的是數組的已排序的副本,而原始數組並沒有改變;也可以使用對象方法ndarray.sort(),對原始數組排序。

numpy.sort(a, axis=1, kind='quicksort')
ndarray.sort(axis=1, kind=None, order=None)

參數注釋:

  • a:所需排序的數組
  • axis:數組排序時的軸,axis=0按照行排序;axis=1按列排序,默認值是1
  • kind:數組排序時使用的方法,其中:kind= ′quicksort ′為快排;kind=′mergesort′ 為歸並排序;kind=′heapsort′為堆排
  • axis指定排序的軸;kind指定排序算法,默認的排序算法是快速排序,np.sort()返回的是數組的已排序的副本,而就是排序則會修改數組本身。

舉個例子,對數組進行排序:

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

r1=np.sort(a)
r2=np.sort(a,axis=0)
r3=np.sort(a,axis=1)

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

2,查找函數

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])

 

六,獲取索引的函數

獲取索引的函數名都以arg為前綴,按照值排序,返回的是索引值;按照值獲取最大值和最小值,返回索引值等。

1,argsort()函數

argsort()函數返回的是按照數組值從小到大的索引值,即返回的是索引值,索引值是按照元素值從小到大得到的。

x=np.array([1,4,3,-1,6,9])
y=np.argsort(x)
#output
array([3, 0, 2, 1, 4, 5], dtype=int64)

元素-1的值是最小的,其索引是3,因此,argsort()的返回列表中是第一個item。

argsort()函數是將x中的元素從小到大排列提取其對應的index(索引),然后輸出到y,按照降序排序:

y=np.argsort(-x)

按照升序排序:

y=np.argsort(x)

2,最大值或最小值的索引

計算數組中最大值和最小值的索引:

  • argmax(axis):返回最大值的索引
  • argmin(axis):返回最小值的索引

舉個例子,返回數組中最小值的索引:

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

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

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

3,argwhere()函數

返回非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]])

4,返回非0值元素的索引

對於二維數組,nonzero()函數返回的是兩個數組:第一個數組是列索引,第二個數組是行索引:

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

七,抽取元素

返回滿足條件的數據元素,當參數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])

八,數學和統計方法

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:])

九,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.])

 

參考文檔:

Numpy參考手冊

NumPy 數組操作


免責聲明!

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



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