NumPy 学习:元素的选择,替换,增删,滚动、排序和索引

在数组中,用axis(轴)表示维度,对于三维数组,axis参数的取值通常有:

  • 当axis=None时,表示把数组展开为一维数组;
  • 当axis=0时,表示按照行(第一维)进行计算;
  • 当axis=1时,表示按照列(第二维)进行计算;
  • 当axis=2时,表示按照深度(第三维度)进行计算。

对NumPy的数组进行操作 ,可以修改数组的元素,对元素进行滚动,转置数组,和其他数组进行组合。

一,元素级别的操作

元素级别的操作主要是指元素的选择和操纵

1,选择元素

根据索引和轴来选择元素,组成新的数组:

ndarray.take(indices, axis=None, out=None)

如果提供out参数,那么结果将会存储在该out参数提供的数组中。

a.take([[0, 1], [2, 3]])
array([[4, 3],
       [5, 7]])

2,替换特定的元素值

把数组展开为一维数组,通过索引来替换值,替换的语法相当于:a.flat[n] values[n]

ndarray.put(indices, values, mode='raise')

举个例子,把数组a的索引为0的元素替换为-44,把索引为2的元素替换为-55:

>>> a = np.arange(5)
>>> a.put([0, 2], [-44, -55])
>>> a
array([-44,   1, -55,   3,   4])
>>> 

二,数组增删

数组元素的删除,追加和插入,注意,这三个方法都是numpy的方法,不是ndarray对象的:

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

参数注释:

obj是slice,是元素的索引

  • 当要删除单个元素时:对于一维数组,是一个标量;对于二维数组,是一个数组。
  • 要删除多个元素时:索引数组

1,按照轴来删除元素

对于二维数组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]])

2,按照轴来追加元素

向二维数组的末尾追加一行:

>>> np.append(arr,[list(np.arange(13,17))],axis=0)
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

3,按照数据的分片来插入数组或元素

在数组的arr[1]处插入一列(axis=1)数据:

>>> np.insert(arr,[1],[[13],[14],[15]],axis=1)
array([[ 1, 13,  2,  3,  4],
       [ 5, 14,  6,  7,  8],
       [ 9, 15, 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])

四,排序

排序操作是按照特定字段的值进行排序,

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:数组排序时使用的方法,有效值是:{‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’},默认值是quicksort(快排),
  • 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))

五,获取索引的函数

获取索引的函数名都以arg为前缀,按照值排序,返回的是索引值;按照值获取最大值和最小值,返回索引值等。

1,argsort()函数

argsort()函数返回的是按照数组值从小到大的索引值,即返回的是索引值,索引值是按照元素值从小到大得到的。

ndarray.argsort(axis=- 1, kind=None, order=None)

举个例子:

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)

举个例子,对数组排序之后,得到每个元素的索引:

>>> x = np.array([3, 1, 2])
>>> x.argsort()
array([1, 2, 0])
>>> x = np.array([[0, 3], [2, 2]])
>>> x
array([[0, 3],
       [2, 2]])
>>> ind = x.argsort(axis=0)  # sorts along first axis (down)
>>> ind
array([[0, 1],
       [1, 0]])

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

 

 

 

参考文档:

Numpy参考手册

NumPy 数组操作

posted @ 2019-09-25 11:13  悦光阴  阅读(5190)  评论(0编辑  收藏  举报