NumPy ndarray 对象可以使用 Python x[obj] 语法进行索引,其中 x 是数组。 numpy 中提供三种索引:字段访问、基本切片、高级索引

numpy 中的基本切片将 Python 的切片基本概念扩展到 N 维。

当 obj 是切片对象(由 start:stop:step 表示法构造)、整数或切片对象和整数的元组时,会发生这种情况。还可以使用省略号和 newaxis 对象。

示例:使用切片对象

在下面的示例中,使用基本切片语法 start:stop:step对给定数组 Arr 进行切片。请注意,在 Python 中,所有索引都是从零开始

import numpy as np

Arr = np.arange(10)
print("Arr 包含:", Arr)

#Arr从索引=1开始,在索引=7处停止,步长=2
SArr = Arr[1:7:2]
print("SArr 包含:", SArr) 

上述代码的输出将是:

Arr 包含: [0 1 2 3 4 5 6 7 8 9]
SArr 包含: [1 3 5] 

示例:不指定start、stop、step的切片对象

可以在不指定start、end或step的情况下构造切片对象。在这种情况下,数组的起始索引被视为start,最后一个索引被视为stop,1 被视为step。考虑下面的示例。

import numpy as np

Arr = np.arange(10)
print("Arr 包含:", Arr)

#从start开始到index=7的Arr
SArr1 = Arr[:7]
print("SArr1 包含:", SArr1)

#从索引=2开始到最后一个的 Arr
SArr2 = Arr[2:]
print("SArr2 包含:", SArr2)

#从索引=2开始到最后一个的Arr
#步骤=2
SArr3 = Arr[2::2]
print("SArr3 包含:", SArr3) 

上述代码的输出将是:

Arr 包含: [0 1 2 3 4 5 6 7 8 9]
SArr1 包含: [0 1 2 3 4 5 6]
SArr2 包含: [2 3 4 5 6 7 8 9]
SArr3 包含: [2 4 6 8] 

示例:使用负索引切片对象

Python 支持负索引,向后从 -1 开始。因此,start和stop的负值可以分别解释为n+start和n+stop,其中n 是相应维度中的元素数量。考虑下面的示例。

import numpy as np

Arr = np.arange(10)
print("Arr 包含:", Arr)

#从索引=-5开始到索引=-1的Arr
SArr = Arr[-5:-1]
print("SArr 包含:", SArr) 

上述代码的输出将是:

Arr 包含: [0 1 2 3 4 5 6 7 8 9]
SArr 包含: [5 6 7 8] 

示例:使用切片函数对数组进行切片

切片对象也可以使用Python内置的切片函数来构造。考虑下面的示例。

import numpy as np

Arr = np.arange(10)
print("Arr 包含:", Arr)

#从索引=1开始到index=7 步长=2
s = slice(1,7,2)
SArr = Arr[s]
print("SArr 包含:", SArr) 

上述代码的输出将是:

Arr 包含: [0 1 2 3 4 5 6 7 8 9]
SArr 包含: [1 3 5] 

示例:选择单个元素

单个元素可以通过指定索引号从数组中选择。

import numpy as np

Arr = np.arange(10)
print("Arr 包含:", Arr)

print("Arr[2]:", Arr[2]) 

上述代码的输出将是:

Arr 包含: [0 1 2 3 4 5 6 7 8 9]
Arr[2]: 2 

示例:二维数组切片

在下面的示例中,对二维数组进行了切片。

import numpy as np

Arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("Arr 包含:\n", Arr)

#从索引Arr[1:]中切片数组
SArr1 = Arr[1:]
print("\nSArr1 包含:\n", SArr1)

#从索引 Arr[1:,1:] 中切片数组
SArr2 = Arr[1:,1:]
print("\nSArr2 包含:\n", SArr2) 

上述代码的输出将是:

Arr 包含:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

SArr1 包含:
 [[4 5 6]
  [7 8 9]]

SArr2 包含:
 [[5 6]
  [8 9]] 

示例:使用省略号对二维数组进行切片

切片也可以使用省略号...来完成。省略号扩展为选择元组索引所有维度所需的 : 对象的数量。在大多数情况下,这意味着扩展选择元组的长度是x.ndim。考虑以下示例。

import numpy as np

Arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("Arr 包含:\n", Arr)

#切片使用:
SArr1 = Arr[:,1]
print("\nSArr1 包含:\n", SArr1)

#使用省略号
SArr2 = Arr[...,1]
print("\nSArr2 包含:\n", SArr2) 

上述代码的输出将是:

Arr 包含:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

SArr1 包含:
 [2 5 8]

SArr2 包含:
 [2 5 8] 

示例:使用 numpy.newaxis 切片二维数组

numpy.newaxis 也可以在切片数组时使用,该数组将结果选择的维度扩展一个单位长度维度。 numpy.newaxis 是 None 的方便别名。考虑以下示例。

import numpy as np

Arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("Arr 包含:\n", Arr)

#切片使用:
SArr1 = Arr[:,1]
print("\nSArr1 包含:\n", SArr1)

#使用np.newaxis
SArr2 = Arr[np.newaxis,:,1]
print("\nSArr2 包含:\n", SArr2)

#使用np.newaxis
SArr3 = Arr[:,np.newaxis,1]
print("\nSArr3 包含:\n", SArr3)

#使用np.newaxis
SArr4 = Arr[:,1,np.newaxis]
print("\nSArr4 包含:\n", SArr4) 

上述代码的输出将是:

Arr 包含:
[[1 2 3]
 [4 5 6]
 [7 8 9]]

SArr1 包含:
 [2 5 8]

SArr2 包含:
 [[2 5 8]]

SArr3 包含:
 [[2]
  [5]
  [8]]

SArr4 包含:
 [[2]
  [5]
  [8]]