Python学习之 NumPy 数值计算基础与高级篇解析
NumPy(Numerical Python)是 Python 科学计算的核心库,提供了高性能的多维数组对象和丰富的数学函数。本文从基础到高级,全面解析 NumPy 的核心用法。
目录
一、NumPy 简介与安装
1.1 什么是 NumPy
NumPy 是 Python 科学计算的基础包,核心是一个强大的 N 维数组对象 ndarray,配合大量数学函数,支持高效的向量化运算。
NumPy 的优势:
- 速度快:底层使用 C 语言实现,比纯 Python 快数十到数百倍
- 内存高效:数组存储连续内存,节省空间
- 功能丰富:提供大量数学、统计、线性代数函数
- 生态核心:Pandas、SciPy、Matplotlib、Scikit-learn 等都依赖 NumPy
1.2 安装与导入
# 安装 NumPy
pip install numpy
# 或使用 conda
conda install numpy
import numpy as np
print(np.__version__) # 查看版本号
二、数组创建基础
2.1 从列表创建数组
实例1:一维数组
import numpy as np
# 从列表创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # [1 2 3 4 5]
print(type(arr1)) # <class 'numpy.ndarray'>
实例2:二维数组(矩阵)
# 从嵌套列表创建二维数组
arr2 = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(arr2)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
实例3:指定数据类型
# 创建浮点型数组
arr_float = np.array([1, 2, 3], dtype=np.float64)
print(arr_float) # [1. 2. 3.]
print(arr_float.dtype) # float64
# 创建整型数组
arr_int = np.array([1.5, 2.7, 3.2], dtype=np.int32)
print(arr_int) # [1 2 3] 小数部分被截断
2.2 特殊数组创建函数
实例4:zeros - 全零数组
# 创建 3x4 的全零数组
zeros_arr = np.zeros((3, 4))
print(zeros_arr)
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
# 指定整数类型
zeros_int = np.zeros((2, 3), dtype=np.int32)
print(zeros_int)
# [[0 0 0]
# [0 0 0]]
实例5:ones - 全一数组
# 创建 2x3x2 的全一三维数组
ones_arr = np.ones((2, 3, 2))
print(ones_arr)
实例6:full - 填充指定值
# 创建 3x3 数组,全部填充 7
full_arr = np.full((3, 3), 7)
print(full_arr)
# [[7 7 7]
# [7 7 7]
# [7 7 7]]
实例7:eye / identity - 单位矩阵
# 创建 4x4 单位矩阵
identity = np.eye(4)
print(identity)
# [[1. 0. 0. 0.]
# [0. 1. 0. 0.]
# [0. 0. 1. 0.]
# [0. 0. 0. 1.]]
# 非方阵单位矩阵
eye_arr = np.eye(3, 5)
print(eye_arr)
实例8:arange - 等差数组
# 类似 range,但返回数组
arr = np.arange(0, 10, 2) # 从0到10,步长2
print(arr) # [0 2 4 6 8]
# 浮点数步长
arr_float = np.arange(0, 1, 0.1)
print(arr_float)
# [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
实例9:linspace - 等间隔数组
# 在 0 到 1 之间生成 5 个等间隔数
lin = np.linspace(0, 1, 5)
print(lin) # [0. 0.25 0.5 0.75 1. ]
# 包含端点控制
lin2 = np.linspace(0, 1, 5, endpoint=False)
print(lin2) # [0. 0.2 0.4 0.6 0.8]
实例10:logspace - 等对数间隔数组
# 生成 10^0 到 10^2 之间的 5 个数
log = np.logspace(0, 2, 5)
print(log)
# [ 1. 3.16227766 10. 31.6227766 100. ]
2.3 随机数组创建
实例11:random 模块基础
# 生成 0-1 之间的随机浮点数
rand_arr = np.random.rand(3, 3)
print(rand_arr)
# 生成标准正态分布随机数
randn_arr = np.random.randn(3, 3)
print(randn_arr)
# 生成指定范围的随机整数
randint_arr = np.random.randint(0, 10, size=(3, 3))
print(randint_arr)
三、数组属性与索引
3.1 数组属性
实例12:查看数组属性
arr = np.array([
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
])
print(f"数组:
{arr}")
print(f"维度数 (ndim): {arr.ndim}") # 3
print(f"形状 (shape): {arr.shape}") # (2, 2, 3)
print(f"元素总数 (size): {arr.size}") # 12
print(f"数据类型 (dtype): {arr.dtype}") # int64
print(f"每项字节数 (itemsize): {arr.itemsize}") # 8
print(f"总字节数 (nbytes): {arr.nbytes}") # 96
3.2 基础索引与切片
实例13:一维数组索引
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # 10 第一个元素
print(arr[-1]) # 50 最后一个元素
print(arr[1:4]) # [20 30 40] 切片
print(arr[::2]) # [10 30 50] 步长为2
print(arr[::-1]) # [50 40 30 20 10] 反转
实例14:多维数组索引
arr2d = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(arr2d[0, 0]) # 1 第一行第一列
print(arr2d[1, 2]) # 6 第二行第三列
print(arr2d[0]) # [1 2 3] 第一行
print(arr2d[:, 1]) # [2 5 8] 第二列
实例15:多维数组切片
arr2d = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
])
# 取前两行
print(arr2d[:2])
# [[1 2 3 4]
# [5 6 7 8]]
# 取中间 2x2 区域
print(arr2d[1:3, 1:3])
# [[ 6 7]
# [10 11]]
# 每隔一行一列取元素
print(arr2d[::2, ::2])
# [[ 1 3]
# [ 9 11]]
四、数组运算
4.1 基本算术运算
实例16:数组与标量运算
arr = np.array([1, 2, 3, 4, 5])
print(arr + 10) # [11 12 13 14 15]
print(arr - 2) # [-1 0 1 2 3]
print(arr * 3) # [ 3 6 9 12 15]
print(arr / 2) # [0.5 1. 1.5 2. 2.5]
print(arr ** 2) # [ 1 4 9 16 25]
print(arr % 2) # [1 0 1 0 1]
实例17:数组与数组运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9]
print(a - b) # [-3 -3 -3]
print(a * b) # [ 4 10 18] 逐元素相乘
print(a / b) # [0.25 0.4 0.5 ]
print(a ** b) # [ 1 32 729]
4.2 比较运算与布尔索引
实例18:比较运算
arr = np.array([1, 5, 3, 8, 2, 9, 4])
print(arr > 5) # [False True False True False True False]
print(arr == 3) # [False False True False False False False]
print(arr != 2) # [ True True True True False True True]
实例19:布尔索引
arr = np.array([1, 5, 3, 8, 2, 9, 4])
# 筛选大于 5 的元素
print(arr[arr > 5]) # [5 8 9]
# 筛选偶数
print(arr[arr % 2 == 0]) # [8 2 4]
# 多条件筛选
print(arr[(arr > 3) & (arr < 8)]) # [5 4]
# 使用 ~ 取反
print(arr[~(arr > 5)]) # [1 3 2 4]
4.3 统计运算
实例20:基础统计函数
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(f"总和: {arr.sum()}") # 45
print(f"平均值: {arr.mean()}") # 5.0
print(f"标准差: {arr.std()}") # 2.58...
print(f"方差: {arr.var()}") # 6.66...
print(f"最小值: {arr.min()}") # 1
print(f"最大值: {arr.max()}") # 9
print(f"最小值索引: {arr.argmin()}") # 0
print(f"最大值索引: {arr.argmax()}") # 8
实例21:按轴统计
arr = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# axis=0 按列计算
print(arr.sum(axis=0)) # [12 15 18]
print(arr.mean(axis=0)) # [4. 5. 6.]
# axis=1 按行计算
print(arr.sum(axis=1)) # [ 6 15 24]
print(arr.mean(axis=1)) # [2. 5. 8.]
实例22:累积运算
arr = np.array([1, 2, 3, 4, 5])
print(np.cumsum(arr)) # [ 1 3 6 10 15] 累积和
print(np.cumprod(arr)) # [ 1 2 6 24 120] 累积积
五、数组形状操作
5.1 reshape - 重塑形状
实例23:reshape 基础
arr = np.arange(12)
print(f"原数组: {arr}") # [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 重塑为 3x4
reshaped = arr.reshape(3, 4)
print(reshaped)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 自动推断维度(用 -1)
print(arr.reshape(3, -1)) # 自动计算列数
print(arr.reshape(2, 2, -1)) # 自动计算最后一维
实例24:reshape 与内存共享
arr = np.arange(6)
reshaped = arr.reshape(2, 3)
# 修改 reshaped 会影响原数组
reshaped[0, 0] = 100
print(arr) # [100 1 2 3 4 5]
# 使用 copy() 创建独立副本
reshaped_copy = arr.reshape(2, 3).copy()
reshaped_copy[0, 0] = 999
print(arr) # 原数组不受影响
5.2 转置与轴交换
实例25:转置操作
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
# 转置
print(arr.T)
# [[1 4]
# [2 5]
# [3 6]]
# 使用 transpose
print(arr.transpose())
# 三维数组转置
arr3d = np.arange(24).reshape(2, 3, 4)
print(arr3d.transpose(1, 0, 2).shape) # (3, 2, 4)
5.3 展开与堆叠
实例26:ravel / flatten - 展平
arr2d = np.array([
[1, 2, 3],
[4, 5, 6]
])
# ravel - 返回视图(共享内存)
print(arr2d.ravel()) # [1 2 3 4 5 6]
# flatten - 返回副本
print(arr2d.flatten()) # [1 2 3 4 5 6]
实例27:vstack / hstack - 堆叠
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 垂直堆叠
print(np.vstack((a, b)))
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 水平堆叠
print(np.hstack((a, b)))
# [[1 2 5 6]
# [3 4 7 8]]
# 深度堆叠
print(np.dstack((a, b)))
实例28:split - 分割
arr = np.arange(12).reshape(3, 4)
# 水平分割
h_splits = np.hsplit(arr, 2)
print("水平分割:")
for s in h_splits:
print(s)
# 垂直分割
v_splits = np.vsplit(arr, 3)
print("垂直分割:")
for s in v_splits:
print(s)
六、广播机制
广播(Broadcasting)是 NumPy 的核心特性,允许不同形状的数组进行运算。
6.1 广播规则
- 从最后一个维度开始比较
- 维度相等,或其中一个为 1,则可以广播
- 否则报错
实例29:标量广播
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr + 10)
# [[11 12 13]
# [14 15 16]]
实例30:一维数组广播到二维
arr = np.array([[1, 2, 3], [4, 5, 6]]) # shape: (2, 3)
row = np.array([10, 20, 30]) # shape: (3,)
print(arr + row)
# [[11 22 33]
# [14 25 36]]
实例31:列向量广播
arr = np.array([[1, 2, 3], [4, 5, 6]]) # shape: (2, 3)
col = np.array([[10], [20]]) # shape: (2, 1)
print(arr + col)
# [[11 12 13]
# [24 25 26]]
实例32:复杂广播
a = np.arange(12).reshape(3, 1, 4) # shape: (3, 1, 4)
b = np.arange(8).reshape(2, 4) # shape: (2, 4)
result = a + b
print(result.shape) # (3, 2, 4)
print(result)
七、通用函数 ufunc
通用函数(Universal Functions)是对数组进行逐元素运算的函数。
7.1 数学函数
实例33:三角函数
angles = np.array([0, np.pi/4, np.pi/2, np.pi])
print(np.sin(angles)) # [0. 0.70710678 1. 0. ]
print(np.cos(angles)) # [ 1.000000e+00 7.071068e-01 6.123234e-17 -1.000000e+00]
print(np.tan(angles))
# 反三角函数
print(np.arcsin([0, 0.5, 1])) # [0. 0.52359878 1.57079633]
实例34:指数与对数
arr = np.array([1, 2, 3, 4])
print(np.exp(arr)) # [ 2.71828183 7.3890561 20.08553692 54.59815003]
print(np.log(arr)) # [0. 0.69314718 1.09861229 1.38629436]
print(np.log10(arr)) # [0. 0.30103 0.47712125 0.60205999]
print(np.log2(arr)) # [0. 1. 1.5849625 2. ]
print(np.sqrt(arr)) # [1. 1.41421356 1.73205081 2. ]
print(np.power(arr, 3)) # [ 1 8 27 64]
7.2 舍入函数
实例35:舍入操作
arr = np.array([1.2, 2.5, 3.7, 4.4])
print(np.round(arr)) # [1. 2. 4. 4.]
print(np.floor(arr)) # [1. 2. 3. 4.]
print(np.ceil(arr)) # [2. 3. 4. 5.]
print(np.trunc(arr)) # [1. 2. 3. 4.]
7.3 条件函数
实例36:where 条件函数
arr = np.array([1, -2, 3, -4, 5])
# 将负数替换为 0
result = np.where(arr > 0, arr, 0)
print(result) # [1 0 3 0 5]
# 根据条件选择
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
condition = np.array([True, False, True])
print(np.where(condition, a, b)) # [ 1 20 3]
实例37:clip 截断
arr = np.array([1, 5, 10, 15, 20])
# 将值限制在 [5, 15] 范围内
print(np.clip(arr, 5, 15)) # [ 5 5 10 15 15]
八、线性代数运算
NumPy 的 linalg 模块提供了丰富的线性代数函数。
实例38:矩阵乘法
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(a, b))
# [[19 22]
# [43 50]]
# 使用 @ 运算符(Python 3.5+)
print(a @ b)
# 逐元素相乘
print(a * b)
# [[ 5 12]
# [21 32]]
实例39:矩阵转置与逆矩阵
a = np.array([[1, 2], [3, 4]])
# 转置
print(a.T)
# 逆矩阵
a_inv = np.linalg.inv(a)
print(a_inv)
# [[-2. 1. ]
# [ 1.5 -0.5]]
# 验证: A @ A_inv = I
print(a @ a_inv)
# [[1. 0.]
# [0. 1.]]
实例40:行列式与特征值
a = np.array([[4, 2], [1, 3]])
# 行列式
print(np.linalg.det(a)) # 10.0
# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(a)
print(f"特征值: {eigenvalues}")
print(f"特征向量:
{eigenvectors}")
实例41:解线性方程组
# 解方程组: 2x + y = 5, x - y = 1
A = np.array([[2, 1], [1, -1]])
b = np.array([5, 1])
x = np.linalg.solve(A, b)
print(f"解: x={x[0]:.2f}, y={x[1]:.2f}") # x=2.00, y=1.00
# 验证
print(A @ x) # [5. 1.]
实例42:SVD 分解
a = np.array([[1, 2], [3, 4], [5, 6]])
U, S, Vt = np.linalg.svd(a)
print(f"U 形状: {U.shape}") # (3, 3)
print(f"S (奇异值): {S}") # [9.52551809 0.51430058]
print(f"Vt 形状: {Vt.shape}") # (2, 2)
九、随机数生成
NumPy 的 random 模块提供了强大的随机数生成功能。
实例43:基础随机数
# 设置随机种子(保证可复现)
np.random.seed(42)
# 0-1 均匀分布
print(np.random.rand(3, 3))
# 标准正态分布
print(np.random.randn(3, 3))
# 指定范围整数
print(np.random.randint(1, 100, size=(3, 3)))
实例44:各种分布
# 正态分布
print(np.random.normal(loc=0, scale=1, size=10))
# 均匀分布
print(np.random.uniform(low=0, high=10, size=10))
# 二项分布
print(np.random.binomial(n=10, p=0.5, size=10))
# 泊松分布
print(np.random.poisson(lam=3, size=10))
# 指数分布
print(np.random.exponential(scale=1, size=10))
实例45:随机抽样
arr = np.arange(10)
# 随机打乱
np.random.shuffle(arr)
print(arr)
# 随机选择(可重复)
print(np.random.choice([1, 2, 3, 4, 5], size=10))
# 随机选择(不重复)
print(np.random.choice([1, 2, 3, 4, 5], size=3, replace=False))
# 按概率抽样
print(np.random.choice(['A', 'B', 'C'], size=10, p=[0.5, 0.3, 0.2]))
实例46:随机排列
# 生成随机排列
print(np.random.permutation(10))
# 数组随机排列
arr = np.array([10, 20, 30, 40, 50])
print(np.random.permutation(arr))
十、高级索引与切片
10.1 花式索引(Fancy Indexing)
实例47:整数数组索引
arr = np.array([10, 20, 30, 40, 50, 60])
# 使用索引数组
indices = np.array([0, 2, 4])
print(arr[indices]) # [10 30 50]
# 使用列表索引
print(arr[[1, 3, 5]]) # [20 40 60]
# 二维花式索引
arr2d = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(arr2d[[0, 2], [1, 2]]) # [2 9] 取 (0,1) 和 (2,2)
实例48:布尔掩码索引
arr = np.arange(10)
# 创建布尔掩码
mask = (arr > 3) & (arr < 8)
print(arr[mask]) # [4 5 6 7]
# 直接赋值
arr[arr % 2 == 0] = -1
print(arr) # [-1 1 -1 3 -1 5 -1 7 -1 9]
10.2 ix_ 函数
实例49:ix_ 构造索引网格
arr = np.arange(16).reshape(4, 4)
# 使用 ix_ 选择子矩阵
rows = np.array([0, 2])
cols = np.array([1, 3])
print(arr[np.ix_(rows, cols)])
# [[ 1 3]
# [ 9 11]]
十一、数组文件读写
11.1 二进制文件
实例50:save / load
arr = np.arange(100).reshape(10, 10)
# 保存为 .npy 文件
np.save('array_data.npy', arr)
# 加载
loaded = np.load('array_data.npy')
print(np.array_equal(arr, loaded)) # True
实例51:savez / load 多个数组
a = np.arange(10)
b = np.arange(20).reshape(4, 5)
c = np.random.randn(3, 3)
# 保存多个数组
np.savez('multiple_arrays.npz', array_a=a, array_b=b, array_c=c)
# 加载
data = np.load('multiple_arrays.npz')
print(data['array_a'])
print(data['array_b'])
print(data['array_c'])
11.2 文本文件
实例52:savetxt / loadtxt
arr = np.array([
[1.5, 2.3, 3.1],
[4.2, 5.1, 6.8],
[7.3, 8.9, 9.0]
])
# 保存为文本
np.savetxt('data.txt', arr, fmt='%.2f', delimiter=',', header='col1,col2,col3')
# 加载文本
loaded = np.loadtxt('data.txt', delimiter=',', skiprows=1)
print(loaded)
十二、性能优化技巧
12.1 向量化运算
实例53:向量化 vs 循环
import time
# 大数据
size = 1000000
a = np.random.rand(size)
b = np.random.rand(size)
# 循环方式
start = time.time()
result_loop = []
for i in range(size):
result_loop.append(a[i] + b[i])
loop_time = time.time() - start
# 向量化方式
start = time.time()
result_vec = a + b
vec_time = time.time() - start
print(f"循环耗时: {loop_time:.4f} 秒")
print(f"向量化耗时: {vec_time:.4f} 秒")
print(f"加速比: {loop_time / vec_time:.0f}x")
12.2 视图 vs 副本
实例54:避免不必要的复制
arr = np.arange(1000000).reshape(1000, 1000)
# 切片返回视图(共享内存)
view = arr[::2, ::2]
print(view.base is arr) # True
# reshape 返回视图
reshaped = arr.reshape(-1)
print(reshaped.base is arr) # True
# ravel 返回视图
raveled = arr.ravel()
print(raveled.base is arr) # True
# flatten 返回副本
flattened = arr.flatten()
print(flattened.base is arr) # False
12.3 预分配内存
实例55:预分配优化
# 低效:动态扩展
result = []
for i in range(10000):
result.append(i * 2)
result = np.array(result)
# 高效:预分配
result = np.empty(10000)
for i in range(10000):
result[i] = i * 2
# 最高效:完全向量化
result = np.arange(10000) * 2
十三、综合实例
实例56:图像灰度化
import numpy as np
# 模拟 3 通道 RGB 图像 (高度, 宽度, 通道)
image = np.random.randint(0, 256, size=(100, 100, 3), dtype=np.uint8)
# 灰度化公式: Gray = 0.299*R + 0.587*G + 0.114*B
weights = np.array([0.299, 0.587, 0.114])
gray_image = np.dot(image, weights).astype(np.uint8)
print(f"原图形状: {image.shape}")
print(f"灰度图形状: {gray_image.shape}")
实例57:数据标准化
def normalize(data, method='standard'):
"""
数据标准化
method='standard': Z-score 标准化 (x - mean) / std
method='minmax': Min-Max 归一化 (x - min) / (max - min)
"""
if method == 'standard':
return (data - data.mean(axis=0)) / data.std(axis=0)
elif method == 'minmax':
return (data - data.min(axis=0)) / (data.max(axis=0) - data.min(axis=0))
# 示例数据
data = np.array([
[1, 200, 3000],
[2, 300, 5000],
[3, 400, 7000],
[4, 500, 9000]
], dtype=np.float64)
print("原始数据:")
print(data)
print("\nZ-score 标准化:")
print(normalize(data, 'standard'))
print("\nMin-Max 归一化:")
print(normalize(data, 'minmax'))
实例58:蒙特卡洛模拟估算圆周率
def estimate_pi(n_samples=1000000):
"""使用蒙特卡洛方法估算 π"""
# 在单位正方形内随机撒点
x = np.random.uniform(-1, 1, n_samples)
y = np.random.uniform(-1, 1, n_samples)
# 计算到原点的距离
distances = np.sqrt(x**2 + y**2)
# 落在单位圆内的比例
inside_circle = np.sum(distances <= 1)
# π = 4 * (圆内点数 / 总点数)
pi_estimate = 4 * inside_circle / n_samples
return pi_estimate
pi = estimate_pi(10000000)
print(f"估算的 π 值: {pi:.6f}")
print(f"实际 π 值: {np.pi:.6f}")
print(f"误差: {abs(pi - np.pi):.6f}")
实例59:滑动窗口计算
def moving_average(data, window_size=3):
"""计算移动平均"""
cumsum = np.cumsum(np.insert(data, 0, 0))
return (cumsum[window_size:] - cumsum[:-window_size]) / window_size
# 示例
prices = np.array([100, 102, 101, 105, 110, 108, 112, 115, 113, 118])
ma = moving_average(prices, window_size=3)
print("原始数据:", prices)
print("3日移动平均:", ma)
实例60:矩阵距离计算
def pairwise_distances(vectors):
"""计算向量间的欧氏距离矩阵"""
# 方法:||a - b||^2 = ||a||^2 + ||b||^2 - 2*a·b
sum_sq = np.sum(vectors ** 2, axis=1)
dist_sq = sum_sq[:, np.newaxis] + sum_sq[np.newaxis, :] - 2 * np.dot(vectors, vectors.T)
# 处理数值误差
dist_sq = np.maximum(dist_sq, 0)
return np.sqrt(dist_sq)
# 示例
points = np.array([
[0, 0],
[3, 4],
[6, 8]
])
dists = pairwise_distances(points)
print("点坐标:")
print(points)
print("\n距离矩阵:")
print(dists)
# [[ 0. 5. 10.]
# [ 5. 0. 5.]
# [10. 5. 0.]]
附录:常用 NumPy 速查表
| 功能 | 函数 |
|---|---|
| 创建数组 | np.array(), np.zeros(), np.ones(), np.full(), np.eye() |
| 序列数组 | np.arange(), np.linspace(), np.logspace() |
| 随机数组 | np.random.rand(), np.random.randn(), np.random.randint() |
| 形状操作 | reshape(), ravel(), flatten(), transpose(), T |
| 堆叠分割 | vstack(), hstack(), dstack(), vsplit(), hsplit() |
| 数学运算 | np.sum(), np.mean(), np.std(), np.min(), np.max() |
| 线性代数 | np.dot(), np.linalg.inv(), np.linalg.det(), np.linalg.eig() |
| 条件选择 | np.where(), np.clip() |
| 文件IO | np.save(), np.load(), np.savetxt(), np.loadtxt() |
本文章从 NumPy 基础到高级应用,涵盖数组创建、索引切片、运算广播、线性代数、随机数、性能优化等核心内容,配合 60 个完整实例,帮助您系统掌握 NumPy 数值计算技术。
更多推荐


所有评论(0)