ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

获取一维数组元素

以下示例, 说明了numpy如何获取一维数组的元素:

  1. nd1=np.arange(10)
  2. #获取指定位置的数据,获取第4个元素
  3. nd1[3] # 3
  4. #截取一段数据
  5. nd1[3:6] # array([3, 4, 5])

slice

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

  1. a = np.arange(10)
  2. s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
  3. print (a[s])

输出:

  1. [2 4 6]

设置间隔

以上实例中,我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:

  1. a = np.arange(10)
  2. b = a[2:7:2]

将间隔设置为负数,达到倒序取数的目的:

  1. a[::-2] # array([9, 7, 5, 3, 1])

获取多维数组元素

以下示例, 说明了numpy如何获取多维数组的元素,先创建一个5*5的数组:

  1. nd2=np.arange(25).reshape([5,5])
  1. array([[ 0, 1, 2, 3, 4],
  2. [ 5, 6, 7, 8, 9],
  3. [10, 11, 12, 13, 14],
  4. [15, 16, 17, 18, 19],
  5. [20, 21, 22, 23, 24]])

获取指定位置的元素:

  1. nd2[0][0] # 0

获取全部元素:

  1. nd2[:, :]

截取区域内数据

截取一个多维数组的一个区域内数据

  1. nd2[1:3,1:3]

输出:

  1. array([[ 6, 7],
  2. [11, 12]])

截取范围内数据

截取一个多维数组中,数值在一个值域之内的数据 (多维数组将展开)

  1. nd2[(nd2>3)&(nd2<10)]

输出:

  1. array([4, 5, 6, 7, 8, 9])

截取整行或整列

获取某一行:

  1. nd2[0] # array([0, 1, 2, 3, 4])

截取多维数组中,指定的行,如读取第2,3行

  1. nd2[[1,2]] # 或 nd2[1:3, :]

输出:

  1. array([[ 5, 6, 7, 8, 9],
  2. [10, 11, 12, 13, 14]])

截取多维数组中,指定的列,如读取第2,3列

  1. nd2[:,1:3]

输出:

  1. array([[ 1, 2],
  2. [ 6, 7],
  3. [11, 12],
  4. [16, 17],
  5. [21, 22]])

多维数组操作有些抽象, 可参考下图:
📃 NumPy切片 - 图1

通过 … 获取某个维度的全部元素

切片还可以包括省略号 ... ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

  1. a = np.arange(9).reshape([3,3])
  2. print(a)
  3. print(a[...,1]) # 第2列元素
  4. print(a[1,...]) # 第2行元素
  5. print(a[...,1:]) # 第2列及剩下的所有元素

输出:

  1. [[0 1 2]
  2. [3 4 5]
  3. [6 7 8]]
  4. [1 4 7]
  5. [3 4 5]
  6. [[1 2]
  7. [4 5]
  8. [7 8]]

拷贝

通过 copy 方法可以生成数组及其数据的完整副本。

  1. >>> a = np.arange(int(1e3))
  2. >>> b = a.copy()
  3. >>> b is a
  4. False
  5. >>> b = a[:100].copy()
  6. >>> del a

增加维度

通过 np.newaxis ,可以增加数组的维度:

  1. a = np.array([1,2,3])
  2. b = a[:, np.newaxis]
  3. print(b)

输出:

  1. [[1]
  2. [2]
  3. [3]]