Python Academy · 课时

索引、切片与高级索引

使用高级索引技术访问和修改数组元素。

第 3 / 4 课13 个步骤

索引、切片与高级索引 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. NumPy 数组与 dtypes
  2. 数组运算与广播
  3. 索引、切片与高级索引
  4. 使用 NumPy 进行线性代数
← 返回 Python Academy