NumPy 快速入门:数组创建、索引、运算与广播机制
NumPy(Numerical Python)是 Python 科学计算生态的基石,提供了高性能的多维数组对象 ndarray 以及大量数学函数。与 Python 原生的 list 相比,NumPy 数组在内存中连续存储,支持向量化运算,底层由 C/Fortran 实现,性能可提升数十倍乃至百倍。
一、NumPy 数组创建
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
zeros = np.zeros((3, 4))
ones = np.ones((2, 3))
full = np.full((2, 2), 99)
empty = np.empty((2, 3))
arange = np.arange(0, 10, 2)
linspace = np.linspace(0, 1, 5)
rng = np.random.default_rng()
rand_arr = rng.random((3, 3))
randn_arr = rng.standard_normal((2, 4))
randint_arr = rng.integers(1, 100, (5,))
print(arr2.shape, arr2.ndim, arr2.dtype, arr2.size)
二、数组索引与切片
a = np.arange(1, 13).reshape(3, 4)
print(a)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
print(a[0])
print(a[1, 2])
print(a[-1])
print(a[0:2])
print(a[:, 0])
print(a[::2, ::2])
b = np.array([3, 7, 2, 8, 5])
print(b[b > 4])
c = np.array([10, 20, 30, 40, 50])
c[c < 30] = 0
print(c)
d = np.arange(100, 110)
print(d[[0, 3, 5]])
三、向量化运算与广播
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a + b)
print(a * 2)
print(a ** 2)
print(a > 2)
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles))
c = np.arange(1, 10).reshape(3, 3)
print(c.sum())
print(c.sum(axis=0))
print(c.sum(axis=1))
print(c.mean())
A = np.array([[1, 2, 3], [4, 5, 6]])
br = np.array([10, 20, 30])
print(A + br)
M1 = np.array([[1, 2], [3, 4]])
M2 = np.array([[5, 6], [7, 8]])
print(M1 @ M2)
四、常见问题
Q1:np.arange 和 np.linspace 有什么区别?arange(start, stop, step) 类似 Python 的 range,不包含 stop 值。linspace(start, stop, num) 在 start 和 stop 之间均匀分布 num 个点,包含 stop 值。
Q2:数组的视图(view)和副本(copy)有何区别?
切片和某些操作返回的是视图,与原数组共享底层数据,修改视图会影响原数组。arr.copy() 返回独立副本。
Q3:广播失败的原因是什么?
从右侧对齐形状维度,只有在维度相等或其中一个为 1 时才能兼容。
五、延伸阅读
- NumPy 官方文档:https://numpy.org/devdocs/
- NumPy 广播原理:Broadcasting — NumPy
- 进阶:NumPy 线性代数
np.linalg