数组切片是从数组中提取一部分的过程。
通过切片,我们可以轻松地访问数组中的元素。它可以应用于 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
参数start
和stop
参数start
、stop
和step
参数
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_start
、row_stop
、row_step
- 分别指定行的起始索引、停止索引和步长col_start
、col_stop
、col_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**)结束