Skip to main content

数组运算与索引切片

NumPy 的所有运算都是逐元素(element-wise)的,无需写循环。


向量化运算

与标量运算

a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
a + 1 # [1 2 3 4 5 6 7 8 9 10]
a * 3 # [0 3 6 9 12 15 18 21 24 27]
3 / a # 0 位置 → inf

数组与数组运算

a = np.arange(10)
b = np.arange(10, 20)

a + b # 对应位置相加:[10 12 14 ...]
a * b # 对应位置相乘
a > b # 逐元素比较,返回布尔数组

比较运算

a = np.array([3, 7, 2, 9, 5])
a > 5 # [False True False True False]

索引与切片

一维数组

与 Python 列表一致:

a = np.arange(10)
a[0] # 0
a[0:4] # [0 1 2 3] — 顾头不顾尾
a[0:8:2] # [0 2 4 6] — 带步长

二维数组 —— 逗号语法

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

# 逗号左边是行,右边是列
a[0, 0] # 第0行第0列 → 0
a[0:2, 0:2] # 前2行 × 前2列 → [[0,1],[5,6]]
a[1:, 2:4] # 第1行开始 × 第2到4列 → [[7,8],[12,13]]

推荐始终使用逗号写法 a[row, col],后续 Pandas 中会更加常用。


视图 vs 拷贝(重要!)

a = np.arange(10)
c = a[0:4] # 切片返回的是**视图**(view),不是拷贝!
c[0] = 999 # 修改 c 会影响原数组 a
print(a[0]) # 999 ← 原数组被修改了!

# 如果需要独立拷贝
c = a[0:4].copy() # 修改 c 不会影响 a

这样设计是为了节省内存:大数据集的切片如果每次都复制,时间和空间开销都太大。