NumPy 数组切片

数组切片是从数组中提取一部分的过程。

通过切片,我们可以轻松地访问数组中的元素。它可以应用于 NumPy 数组的一个或多个维度。


NumPy 数组切片语法

NumPy 中数组切片的语法如下:

array[start:stop:step]

这里,

  • start - 切片中包含的第一个元素的索引
  • stop - 最后一个元素的索引(不包含)
  • step - 切片中每个元素之间的步长

注意: 当我们对数组进行切片时,起始索引是包含的,但结束索引是不包含的。

  • 如果省略 start,切片将从第一个元素开始。
  • 如果省略 stop,切片将一直进行到最后一个元素。
  • 如果省略 step,默认步长为 1。

一维 NumPy 数组切片

在 NumPy 中,可以使用切片运算符 : 来访问数组的一部分。例如:

import numpy as np

# create a 1D array 
array1 = np.array([1, 3, 5, 7, 8, 9, 2, 4, 6])

# slice array1 from index 2 to index 6 (exclusive)
print(array1[2:6])  # [5 7 8 9]

# slice array1 from index 0 to index 8 (exclusive) with a step size of 2
print(array1[0:8:2])  # [1 5 8 2]

# slice array1 from index 3 up to the last element
print(array1[3:])  # [7 8 9 2 4 6]

# items from start to end
print(array1[:])   # [1 3 5 7 8 9 2 4 6]

在上面的示例中,我们创建了一个名为 array1 的数组,其中包含 **9** 个元素。

然后,我们使用切片运算符 : 来切片数组元素。

  • array1[2:6] - 切片 array1 从索引 **2** 到索引 **6**,不包含索引 **6**
  • array1[0:8:2] - 切片 array1 从索引 **0** 到索引 **8**,不包含索引 **8**
  • array1[3:] - 切片 array1 从索引 **3** 到最后一个元素
  • array1[:] - 返回从头到尾的所有元素

使用切片修改数组元素

使用切片,我们还可以通过以下方式修改数组元素:

  • start 参数
  • stop 参数
  • startstop 参数
  • startstopstep 参数

1. 使用 start 参数

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# modify elements from index 3 onwards
numbers[3:] = 20
print(numbers)

# Output: [ 2  4  6 20 20 20]

这里,numbers[3:] = 20 将从索引 **3** 开始的所有元素替换为新值 **20**。

2. 使用 stop 参数

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# modify the first 3 elements
numbers[:3] = 40
print(numbers)

# Output: [40 40 40  8 10 12]

这里,numbers[:3] = 20 将前 3 个元素替换为新值 **40**。

3. 使用 start 和 stop 参数

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# modify elements from indices 2 to 5
numbers[2:5] = 22
print(numbers)

# Output: [2 4 22 22 22 12]

这里,numbers[2:5] = 22 选择从索引 **2** 到索引 **4** 的元素,并将它们替换为新值 **22**。

4. 使用 start、stop 和 step 参数

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# modify every second element from indices 1 to 5
numbers[1:5:2] = 16
print(numbers)

# Output: [ 2 16  6 16 10 12]

在上面的例子中:

numbers[1:5:2] = 16

将从索引 **1** 到索引 **5** 的每隔一个元素修改为新值 **16**。


NumPy 数组负切片

我们还可以使用负索引在 NumPy 数组中执行负切片。在负切片期间,元素是从数组末尾访问的。

让我们看一个例子。

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# slice the last 3 elements of the array
# using the start parameter
print(numbers[-3:])    # [8 10 12]

# slice elements from 2nd-to-last to 4th-to-last element
# using the start and stop parameters
print(numbers[-5:-2])    # [4 6 8] 

# slice every other element of the array from the end
# using the start, stop, and step parameters
print(numbers[-1::-2])   # [12 8 4]

输出

Using numbers[-3:]- [ 8 10 12]
Using numbers[-5:-2]- [4 6 8]
Using numbers[-1::-2]- [12  8  4]

这里,

  • numbers[-3:] - 切片 numbers 的最后 3 个元素
  • numbers[-5:-2] - 切片 numbers 从倒数第 5 个到倒数第 2 个(不包含)的元素
  • numbers[-1::-2] - 从末尾开始,以步长 **2** 切片 numbers 的每隔一个元素

使用负切片反转 NumPy 数组

在 NumPy 中,我们还可以使用负切片反转数组元素。例如:

import numpy as np

# create a numpy array
numbers = np.array([2, 4, 6, 8, 10, 12])

# generate reversed array
reversed_numbers = numbers[::-1]
print(reversed_numbers)

# Output: [12 10 8 6 4 2]

在这里,切片 numbers[::-1] 以步长 **-1** 选择数组的所有元素,从而反转了元素的顺序。


二维 NumPy 数组切片

二维 NumPy 数组可以看作一个矩阵,其中每个元素都有两个索引:行索引和列索引。

要对二维 NumPy 数组进行切片,我们可以使用与一维 NumPy 数组切片相同的语法。唯一不同的是,我们需要为数组的每个维度指定一个切片。

二维 NumPy 数组切片语法

array[row_start:row_stop:row_step, col_start:col_stop:col_step]

这里,

  • row_startrow_stoprow_step - 分别指定行的起始索引、停止索引和步长
  • col_startcol_stopcol_step - 分别指定列的起始索引、停止索引和步长

让我们通过一个例子来理解这一点。

# create a 2D array
array1 = np.array([[1, 3, 5, 7], 
                   [9, 11, 13, 15]])

print(array1[:2, :2])

# Output

[[ 1  3]
 [ 9 11]]

这里,[:2, :2] 中的 , 分隔了数组的行。

第一个 :2 返回前 2 行,即整个 array1。结果如下:

[1  3]

第二个 :2 从这 2 行中返回前 2 列。结果如下:

[9 11]

示例:二维 NumPy 数组切片

import numpy as np

# create a 2D array 
array1 = np.array([[1, 3, 5, 7], 
                      [9, 11, 13, 15],
                      [2, 4, 6, 8]])


# slice the array to get the first two rows and columns
subarray1 = array1[:2, :2]

# slice the array to get the last two rows and columns
subarray2 = array1[1:3, 2:4]

# print the subarrays
print("First Two Rows and Columns: \n",subarray1)
print("Last two Rows and Columns: \n",subarray2)

输出

First Two Rows and Columns: 
[[ 1  3]
 [ 9 11]]
Last two Rows and Columns: 
 [[13 15]
 [ 6  8]]

这里,

  • array1[:2, :2] - 切片 array1,从第一行和第一列(默认值)开始,到第二行和第二列(不包含)结束
  • array1[1:3, 2:4] - 切片 array1,从第二行和第三列(索引 **1** 和 **2**)开始,到第三行和第四列(索引 **2** 和 **3**)结束

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战