Python NumPy 数组索引

NumPy 数组索引是对 ndarray 中元素进行访问、选择和修改的基本手段,是使用 NumPy 进行数值计算和数据分析的核心操作之一。通过数组索引,可以快速定位一维、二维及多维数组中的任意元素或子集。NumPy 支持多种索引方式,包括 普通索引(基本索引)、切片索引、高级索引(整数数组索引、花式索引) 以及 布尔索引。这些索引方式不仅能够高效读取数据,还可以直接对满足条件的元素进行批量修改。与 Python 原生列表相比,NumPy 的数组索引更加灵活、表达能力更强,并且在底层由 C 实现,具有更高的执行效率。熟练掌握 NumPy 数组索引,是深入学习 NumPy、数据分析和机器学习的必备基础。

1、普通索引(Basic Indexing)

普通索引是指 使用单个整数或整数切片 来访问数组中的元素。
其行为与 Python 的列表索引非常相似。

1)索引一维数组元素

NumPy 数组的索引 从 0 开始

  • 第一个元素索引为 0

  • 第二个元素索引为 1

  • 以此类推

示例:访问第一个元素

import numpy as np

arr = np.array([1, 2, 3, 4])
print(arr[0])

示例:访问第二个元素

print(arr[1])

示例:访问第三和第四个元素并相加

print(arr[2] + arr[3])

2)索引二维数组

对于二维数组,可以使用 逗号分隔的索引,格式为:

arr[row_index, col_index]

示例:访问第一行第二列的元素

import numpy as np arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) print('arr[0, 1]:', arr[0, 1])

示例:访问第二行第五列的元素

print('arr[1, 4]:', arr[1, 4])

3)索引三维数组

三维数组的索引格式为:

arr[dim1, dim2, dim3]

示例:访问第一个二维数组中,第二行第三列的元素

import numpy as np arr = np.array([ [[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]] ]) print(arr[0, 1, 2])

示例说明

arr[0, 1, 2] 的含义:

  1. 0:选择第一个二维数组

    [[1, 2, 3], [4, 5, 6]]

  2. 1:选择该二维数组中的第二行

    [4, 5, 6]

  3. 2:选择该行中的第三个元素 → 6

2、高级索引(Advanced Indexing)

高级索引是指 使用数组或布尔值作为索引 来访问数组元素。
与普通索引不同的是:

高级索引返回的是数据的拷贝,而不是视图(view)


1)整数数组索引

可以使用一个 整数数组 来索引目标数组。

示例:使用整数数组索引二维数组(按行)

import numpy as np

a = np.array([[1, 2],
              [3, 4],
              [5, 6]])

idx = np.array([[0, 2],
                [1, 2]])

print(a[idx])

输出结果:

[[[1 2] [5 6]] [[3 4] [5 6]]]

📌 注意:
这里的 idx 本身是一个数组,因此不能写成:

a[[0, 2], [1, 2]] # 含义不同


2)花式索引(Fancy Indexing)

花式索引 是高级索引的一种形式,指 使用多个整数数组分别指定每个维度的索引

其核心特点是:

  • 索引数组中的值作为目标数组对应轴的下标

  • 返回结果是一维数组(按元素一一对应)

示例:花式索引一维与二维数组

import numpy as np

a = np.array([[1, 2],
              [3, 4],
              [5, 6]])

print(a[[0, 1, 1]])
print("---------")
print(a[[0, 1, 1], [0, 0, 0]])

输出:

[[1 2] [3 4] [3 4]] --------- [1 3 3]

解释:

  • a[[0,1,1]]:按行索引

  • a[[0,1,1],[0,0,0]]:行列一一对应取值


3)布尔索引(Boolean Indexing)

布尔索引 用于根据条件筛选数组中的元素。

其核心思想是:

  • 先生成一个布尔数组(True / False)

  • 再用该布尔数组索引原数组

示例:布尔索引筛选数据

import numpy as np

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

mask = data > 5print(data[mask])

输出:

[6 7 8]


4)高级索引综合示例

import numpy as np

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

# 整数数组索引
indices = np.array([1, 3, 5])
print(arr[indices])   # [2 4 6]# 布尔索引
mask = arr > 5print(arr[mask])      # [6 7 8 9]# 修改指定位置的元素
arr[indices] = 0print(arr)

二维数组高级索引

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

row_indices = np.array([0, 2])
col_indices = np.array([1, 2])

print(matrix[row_indices, col_indices])  # [2 9]

布尔索引修改数组

mask = matrix > 3
matrix[mask] = 0
print(matrix)

输出:

[[1 2 3] [0 0 0] [0 0 0]]

3、负索引(Negative Indexing)

负索引用于 从数组末尾开始访问元素

  • -1:最后一个元素

  • -2:倒数第二个元素

示例:访问第二行的最后一个元素

import numpy as np

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

print('Last element from 2nd row:', arr[1, -1])

输出:

Last element from 2nd row: 10

推荐阅读
cjavapy编程之路首页