索引、切片与高级索引
使用高级索引技术访问和修改数组元素。
索引、切片与高级索引 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
基本索引
使用从零开始的整数索引访问元素。负索引从末尾开始计数。多维数组使用逗号分隔的索引。
import numpy as np
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[0, 2]) # 3
print(arr[-1, -1]) # 9
print(arr[1]) # [4 5 6]切片
切片语法 start:stop:step 会返回一个视图,并独立应用于每个维度。
import numpy as np
m = np.arange(16).reshape(4,4)
print(m[1:3, 1:3])
# [[5 6]
# [9 10]]
print(m[::2, ::2]) # every other row and column布尔索引(掩码)
传入一个形状相同的布尔数组,即可选择值为 True 的元素。
import numpy as np
arr = np.array([1, -2, 3, -4, 5])
mask = arr > 0
print(mask) # [ True False True False True]
print(arr[mask]) # [1 3 5]
arr[~mask] = 0 # set negatives to 0
print(arr) # [1 0 3 0 5]使用整数数组进行高级索引
传入一个由整数索引组成的数组,即可选择多个指定元素。
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
idx = np.array([0, 2, 4])
print(arr[idx]) # [10 30 50]
# 2-D fancy indexing:
m = np.arange(9).reshape(3,3)
print(m[[0,2], [0,2]]) # [m[0,0], m[2,2]] = [0, 8]使用 np.where 进行索引选择
np.where(condition)(传入一个参数)会返回条件为 True 的位置索引。
import numpy as np
arr = np.array([5, 2, 8, 1, 9])
idx = np.where(arr > 4)[0]
print(idx) # [0 2 4]
print(arr[idx]) # [5 8 9]np.take 和 np.put
np.take(arr, indices) 选择元素(支持扁平索引)。np.put(arr, indices, values) 插入值。
import numpy as np
arr = np.array([10, 20, 30, 40])
print(np.take(arr, [1, 3])) # [20 40]
np.put(arr, [0, 2], [99, 88])
print(arr) # [99 20 88 40]np.nonzero
np.nonzero(arr) 返回一个数组元组,每个维度对应一个数组,其中包含非零元素的索引。
import numpy as np
arr = np.array([[0,1,0],[2,0,3]])
rows, cols = np.nonzero(arr)
print(rows, cols) # [0 1 1] [1 0 2]省略号索引
...(Ellipsis)会展开为所需数量的 :,以覆盖剩余维度。
import numpy as np
arr = np.ones((2,3,4,5))
print(arr[0, ..., 2].shape) # (3, 4) — first dim=0, last dim=2
print(arr[..., 0].shape) # (2, 3, 4) — last dim=0使用 np.ix_ 进行外部索引
np.ix_ 根据多个一维序列构造开放网格,用于外积形式的高级索引。
import numpy as np
m = np.arange(25).reshape(5,5)
rows = [0, 2, 4]
cols = [1, 3]
print(m[np.ix_(rows, cols)])
# [[ 1 3]
# [11 13]
# [21 23]]向高级索引结果赋值
您可以直接为高级索引选出的结果赋值。
import numpy as np
arr = np.zeros(5)
arr[[1, 3]] = [10, 20]
print(arr) # [ 0. 10. 0. 20. 0.]
# Broadcast a scalar:
arr[[0, 2, 4]] = 99
print(arr) # [99. 10. 99. 20. 99.]索引中的视图与副本
基本索引或切片索引 → 视图(修改它会改变原数组)。高级索引或布尔索引 → 副本(修改它不会改变原数组)。
import numpy as np
arr = np.arange(5)
view = arr[1:4] # view
view[0] = 99
print(arr) # [0 99 2 3 4]
copy = arr[[1,2,3]] # fancy → copy
copy[0] = 0
print(arr) # unchanged快速检查
布尔索引或高级索引返回的是视图还是副本?
回顾
使用 [row, col] 访问单个元素,使用 start:stop:step 创建切片(视图),使用布尔数组进行掩码操作(副本),使用整数数组进行高级索引(副本)。使用 np.where 获取索引,使用 np.ix_ 创建外部网格。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 76
- 课程
- 320
常见问题解答
「索引、切片与高级索引」课时是免费的吗?
是的 — 「索引、切片与高级索引」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「索引、切片与高级索引」这节课中我会学到什么?
使用高级索引技术访问和修改数组元素。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「索引、切片与高级索引」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- NumPy 数组与 dtypes
- 数组运算与广播
- 索引、切片与高级索引
- 使用 NumPy 进行线性代数