跳转至

NumPy数组的切片和索引

NumPy 的 ndarray 提供了强大的切片和索引功能,这些功能允许我们高效地访问和操作数组的特定元素或子数组。下面详细介绍 ndarray 的索引和切片方法,并通过示例进行说明。

基本索引

一维数组索引

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr[0])   # 输出: 1
print(arr[4])   # 输出: 5
print(arr[-1])  # 输出: 5 (从末尾开始索引)

多维数组索引

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d[0, 0])  # 输出: 1
print(arr_2d[1, 2])  # 输出: 6
print(arr_2d[-1, -1])  # 输出: 9

切片

一维数组切片

arr = np.array([1, 2, 3, 4, 5])
print(arr[1:4])   # 输出: [2 3 4]
print(arr[:3])    # 输出: [1 2 3]
print(arr[2:])    # 输出: [3 4 5]
print(arr[::2])   # 输出: [1 3 5] (步长为2)
print(arr[::-1])  # 输出: [5 4 3 2 1] (反转数组)

多维数组切片

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 取第一行
print(arr_2d[0, :])  # 输出: [1 2 3]

# 取第二列
print(arr_2d[:, 1])  # 输出: [2 5 8]

# 取右下2x2子数组
print(arr_2d[1:3, 1:3])  # 输出: [[5 6]
                        #        [8 9]]

高级索引

布尔索引

arr = np.array([1, 2, 3, 4, 5])
bool_idx = arr > 3
print(bool_idx)     # 输出: [False False False  True  True]
print(arr[bool_idx])  # 输出: [4 5]

对于多维数组:

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
bool_idx_2d = arr_2d > 5
print(bool_idx_2d)
# 输出:
# [[False False False]
#  [False False  True]
#  [ True  True  True]]
print(arr_2d[bool_idx_2d])  # 输出: [6 7 8 9]

花式索引

使用整数数组进行索引:

arr = np.array([10, 20, 30, 40, 50])
idx = [0, 2, 4]
print(arr[idx])  # 输出: [10 30 50]

arr_2d = np.array([[1, 2], [3, 4], [5, 6]])
row_idx = [0, 1, 2]
col_idx = [1, 0, 1]
print(arr_2d[row_idx, col_idx])  # 输出: [2 3 6]

结合切片和索引

可以将切片和索引结合使用:

arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 提取指定行和列
print(arr_2d[:2, 1:3])
# 输出:
# [[2 3]
#  [6 7]]

# 使用布尔索引结合切片
bool_idx = arr_2d[:, 1] > 5
print(arr_2d[bool_idx, :])
# 输出:
# [[ 5  6  7  8]
#  [ 9 10 11 12]]

修改数组元素

索引和切片不仅可以用来访问元素,还可以用来修改元素:

arr = np.array([1, 2, 3, 4, 5])
arr[0] = 10
print(arr)  # 输出: [10  2  3  4  5]

arr[1:4] = [20, 30, 40]
print(arr)  # 输出: [10 20 30 40  5]

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr_2d[0, 0] = 10
print(arr_2d)
# 输出:
# [[10  2  3]
#  [ 4  5  6]
#  [ 7  8  9]]

arr_2d[:, 2] = [30, 60, 90]
print(arr_2d)
# 输出:
# [[10  2 30]
#  [ 4  5 60]
#  [ 7  8 90]]

这些示例展示了 NumPy 数组的各种索引和切片方法。通过这些功能,可以灵活高效地访问、修改和操作数组中的数据。

评论