0Pricing
Pandas & NumPy Academy · 课时

数组切片与索引

在多维数组上使用整数和切片表示法选择单个元素、行、列和子数组。

数组切片与索引 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

一维数组的整数索引

一维数组的索引方式与列表一样:a[0] 是第一个元素,a[-1] 是最后一个元素。索引会返回一个标量,负数索引从末尾开始计数。

import numpy as np

a = np.array([10, 20, 30, 40, 50])
print(a[0])    # 10
print(a[-1])   # 50
print(a[2])    # 30

切片一维数组

切片和列表一样使用 start:stop:step,但 NumPy 切片返回的是视图,不会复制数据。修改切片就会修改原数组,因此需要时请使用 .copy()。

import numpy as np

a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print(a[2:7])      # [2 3 4 5 6]
print(a[::2])      # [0 2 4 6 8]
print(a[::-1])     # [9 8 7 6 5 4 3 2 1 0]

索引二维数组

对于二维数组,请使用逗号语法:a[row, col]。单独的冒号表示该轴上的全部内容,因此 a[0, :] 会取得整行,而 a[:, 1] 会取得整列。

import numpy as np

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

print(m[1, 2])     # 6  (row 1, col 2)
print(m[0, :])     # [1 2 3]  first row
print(m[:, 1])     # [2 5 8]  second column

二维数组切片

提供两个切片即可取得一个矩形区域:a[0:2, 1:3] 会选取相应的行和列。结果是一个视图,因此对它的修改会反映到原数组中。

import numpy as np

m = np.arange(16).reshape(4, 4)
print(m)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]]

print(m[1:3, 1:3])
# [[ 5  6]
#  [ 9 10]]

布尔索引

传入布尔数组,只保留标记为 True 的元素。这种布尔索引始终返回副本,是筛选数据的标准方式。

import numpy as np

a = np.array([3, 7, 2, 9, 1, 6])
mask = a > 4
print(mask)     # [False  True False  True False  True]
print(a[mask])  # [7 9 6]

# Equivalent one-liner
print(a[a > 4])  # [7 9 6]

使用整数数组进行高级索引

高级索引允许您使用整数列表选取任意位置的元素——顺序可以任意,也可以重复选取。它始终返回副本。

import numpy as np

a = np.array([10, 20, 30, 40, 50])
idx = [4, 1, 3]
print(a[idx])    # [50 20 40]

# Selecting specific rows from a 2D array
m = np.arange(20).reshape(4, 5)
print(m[[0, 2], :])  # rows 0 and 2

使用 np.where 进行条件选择

np.where(condition, x, y) 会在 condition 为 True 的位置选择 x,在为 False 的位置选择 y——这是一种快速、无需循环的逐元素取值方式。

import numpy as np

a = np.array([5, -3, 8, -1, 2])
result = np.where(a > 0, a, 0)  # keep positives, zero negatives
print(result)  # [5 0 8 0 2]

# np.where with one argument returns indices of True elements
idx = np.where(a > 0)
print(idx)     # (array([0, 2, 4]),)

切片是视图——请注意

请注意:由于切片是视图,修改切片也会修改原数组。需要独立的数据片段吗?请先对切片调用 .copy()。⚠️

import numpy as np

original = np.arange(6)
view = original[2:5]   # view, not copy
view[:] = 99
print(original)  # [ 0  1 99 99 99  5]  -- original changed!

safe = original[2:5].copy()  # true copy
safe[:] = 0
print(original)  # [ 0  1 99 99 99  5]  -- unchanged

三维数组索引

数组可以有任意数量的维度。对于三维数组,您需要使用三个位置进行索引:a[depth, row, col],这在处理图像批次时很常见。

import numpy as np

t = np.arange(24).reshape(2, 3, 4)
print(t.shape)       # (2, 3, 4)
print(t[0, :, :])    # first 'plane' -- shape (3, 4)
print(t[1, 2, 3])    # scalar at depth 1, row 2, col 3

通过索引赋值

任何索引形式都可以放在 = 的左侧,以原地修改值,包括切片、掩码或高级索引。赋一个标量后,NumPy 会将它扩展到每个位置。

import numpy as np

a = np.zeros(8)
a[2:5] = 1.0          # slice assignment
print(a)  # [0. 0. 1. 1. 1. 0. 0. 0.]

a[a == 0] = -1.0      # boolean assignment
print(a)  # [-1. -1.  1.  1.  1. -1. -1. -1.]

省略号和 np.newaxis

np.newaxis(或 None)会添加一个大小为 1 的轴,将形状为 (5,) 的数组转换为形状为 (5, 1) 的列向量,这是广播前常见的准备步骤。

import numpy as np

t = np.ones((2, 3, 4))
print(t[..., 0].shape)   # (2, 3) -- last axis fixed at 0

a = np.array([1, 2, 3])
print(a.shape)                 # (3,)
print(a[:, np.newaxis].shape)  # (3, 1) column vector

快速检查

检验您对本课 NumPy 数组切片和索引内容的理解。

课程回顾

做得很好!切片是共享内存的视图,布尔索引会筛选并复制数据,而高级索引可以选取您指定的任意元素。下一步学习通用函数。

常见问题解答

「数组切片与索引」课时是免费的吗?

是的 — 「数组切片与索引」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「数组切片与索引」这节课中我会学到什么?

在多维数组上使用整数和切片表示法选择单个元素、行、列和子数组。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「数组切片与索引」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建 NumPy 数组
  2. 数组属性与检查
  3. 逐元素算术运算
  4. 数组切片与索引
← 返回 Pandas & NumPy Academy