NumPy(Numerical Python)是 Python 科学计算的核心库,提供了高性能的多维数组对象和丰富的数学函数。本文从基础到高级,全面解析 NumPy 的核心用法。


目录

  1. NumPy 简介与安装
  2. 数组创建基础
  3. 数组属性与索引
  4. 数组运算
  5. 数组形状操作
  6. 广播机制
  7. 通用函数 ufunc
  8. 线性代数运算
  9. 随机数生成
  10. 高级索引与切片
  11. 数组文件读写
  12. 性能优化技巧
  13. 综合实例

一、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. 从最后一个维度开始比较
  2. 维度相等,或其中一个为 1,则可以广播
  3. 否则报错

实例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 数值计算技术。

 

更多推荐