数组切片与索引
在多维数组上使用整数和切片表示法选择单个元素、行、列和子数组。
数组切片与索引 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- 创建 NumPy 数组
- 数组属性与检查
- 逐元素算术运算
- 数组切片与索引