【发布时间】:2015-11-17 16:30:28
【问题描述】:
我有以下代码sn-p
def norm(x1, x2):
return np.sqrt(((x1 - x2)**2).sum(axis=0))
def call_norm(x1, x2):
x1 = x1[..., :, np.newaxis]
x2 = x2[..., np.newaxis, :]
return norm(x1, x2)
据我了解,每个x 代表 N 维空间中的一个点数组,其中 N 是数组的最终维度的大小(因此对于 3 空间中的点,最终维度的大小为 3)。它插入额外的维度并使用广播来生成这些点集的笛卡尔积,从而计算所有点对之间的距离。
x = np.array([[1, 2, 3],[1, 2, 3]])
call_norm(x, x)
array([[ 0. , 1.41421356, 2.82842712],
[ 1.41421356, 0. , 1.41421356],
[ 2.82842712, 1.41421356, 0. ]])
(所以[1,1]和[2,2]之间的距离是1.41421356,正如预期的那样)
我发现对于中等大小的问题,这种方法可能会使用大量内存。我可以轻松地“去矢量化”问题并通过迭代替换它,但我希望这会很慢。我有一个(合理的)简单的折衷解决方案,我可以拥有矢量化的大部分速度优势,但没有内存损失?一些花哨的生成器技巧?
【问题讨论】:
-
你可以使用
pdist&squareform:squareform(pdist(x.T))。 -
您是否总是计算同一数组中的对的距离,即
call_norm的两个输入是否相同? -
@Divakar :感谢您的回复!不,我有时需要有不同的论点
-
我想然后看看
cdist。
标签: python numpy generator broadcast