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

如何用NumPy/SciPy预定义函数实现多维向量数组的成对元素相减?

当然有!刚好有两种简洁的实现方式,分别基于NumPy和SciPy,完全满足你「极简」和「不关心减法顺序(符号)」的需求。

方法1:NumPy广播(最直观的极简实现)

如果你只需要NumPy就能搞定,用广播机制直接生成所有两两向量的差,再取绝对值消除符号问题就行。假设你的多维数组X形状是(n, d)(n个d维向量),代码如下:

import numpy as np

# 示例:3个2维向量
X = np.array([[1, 2], [3, 4], [5, 6]])
# 生成所有两两向量的差的绝对值,结果形状是(n, n, d)
pairwise_diff_abs = np.abs(X[:, None, :] - X[None, :, :])

这里的广播技巧很简单:X[:, None, :]把原数组变形为(n, 1, d),X[None, :, :]变形为(1, n, d),两者相减时会自动广播成(n, n, d)的数组,其中pairwise_diff_abs[i, j]就是|X[i] - X[j]|。

如果不想保留重复的成对结果(比如i<j和j<i的结果其实一样),可以提取上三角部分:

# 提取i < j的非重复成对结果,形状为(n*(n-1)/2, d)
mask = np.triu_indices_from(pairwise_diff_abs, k=1)
unique_pairwise_diff = pairwise_diff_abs[mask]

方法2:用SciPy的pdist(贴合你提到的函数)

如果你一定要用scipy.spatial.distance.pdist,可以自定义距离函数来返回元素级的差的绝对值。注意pdist默认返回的是两两对的标量结果,但我们可以让它返回向量形式的差:

from scipy.spatial.distance import pdist

# 自定义metric返回每个向量对的差的绝对值数组
pairwise_diff = pdist(X, lambda u, v: np.abs(u - v))
# 结果形状是(n*(n-1)/2, d),每个元素对应一对向量的差的绝对值

不过说实话,NumPy的广播方法更直观,代码也更简洁,不需要额外引入SciPy,更贴合你的「极简实现」需求。

内容的提问来源于stack exchange,提问作者Hyuntae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:50:36