You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:52:50