Python/Numpy中None作为数组索引的作用及距离计算疑问
理解NumPy中None作为索引的用法及两两欧氏距离计算
核心:None = np.newaxis,用来插入新维度
在NumPy里,None(或者等价的np.newaxis)作为索引时,作用是给数组插入一个长度为1的新维度,目的是触发广播机制,让不同形状的数组能进行元素级运算。
x[:, None] 和 y[None] 的形状差异
假设你的输入是:
x是二维数组,形状为(N, D):N个样本,每个样本D维y是二维数组,形状为(M, D):M个样本,每个样本D维
1. x[:, None] 的重塑
x[:, None] 表示:
:取x的所有行(第一个维度的所有元素)None在第二个维度的位置插入一个新维度
最终形状变为(N, 1, D)。可以理解为把每个x的样本都单独放在一个长度为1的“行组”里。
2. y[None] 的重塑
y[None] 等价于 y[None, :],表示:
None在第一个维度的位置插入一个新维度:取y的所有行
最终形状变为(1, M, D)。可以理解为把整个y的样本集放在一个长度为1的“列组”里。
为什么这样能计算两两欧氏距离?
NumPy的广播机制会自动扩展维度为1的轴,让两个数组形状匹配:
x[:, None](N,1,D) 会被广播成(N, M, D)y[None](1,M,D) 会被广播成(N, M, D)
此时做 x[:, None] - y[None],就是每个x样本(N个)和每个y样本(M个)的对应维度相减,得到的差数组形状是(N,M,D)。
接下来:
**2对每个差元素平方,形状不变np.sum(..., -1)沿着最后一个维度(D维)求和,得到每个(x[i], y[j])对的平方和,形状变为(N,M)np.sqrt(...)开根号,就得到所有x[i]与y[j]之间的欧氏距离数组,正好符合你的需求。
举个直观的小例子
import numpy as np # 定义x和y x = np.array([[1, 2], [3, 4]]) # shape (2, 2) → 2个2维样本 y = np.array([[5, 6], [7, 8], [9, 10]]) # shape (3, 2) → 3个2维样本 # 查看重塑后的形状 print(x[:, None].shape) # (2, 1, 2) print(y[None].shape) # (1, 3, 2) # 计算距离 distances = np.sqrt(np.sum((x[:, None] - y[None])**2, -1)) print(distances.shape) # (2, 3) → 2个x样本 × 3个y样本的距离矩阵 print(distances) # 输出: # [[5.65685425 8.48528137 11.3137085 ] # [2.82842712 5.65685425 8.48528137]]
等价写法补充
x[:, None]等价于x[:, np.newaxis]或x[..., None](二维数组下)y[None]等价于y[np.newaxis, :]
内容的提问来源于stack exchange,提问作者Trường An Tô Nguyễn
相关产品推荐
相关产品推荐

