【问题标题】:scipy cdist or pdist on arrays of complex numbers复数数组上的 scipy cdist 或 pdist
【发布时间】:2014-03-23 04:32:52
【问题描述】:

使用scipy.spatial.distance.euclidean 计算两个复数之间的欧几里得距离有效:

import numpy
import scipy.spatial.distance
z1 = numpy.complex(numpy.cos(0), numpy.sin(0))
z2 = numpy.complex(numpy.cos(3*numpy.pi/2), numpy.sin(3*numpy.pi/2))
print scipy.spatial.distance.euclidean(z1, z2)

给予:

1.4142135623730951

但是,成对距离矩阵或两个输入数组中每对之间的距离不起作用:

A = numpy.random.uniform(size=(5,1)) + numpy.random.uniform(size=(5,1))*1j
print scipy.spatial.distance.pdist(A)

返回警告和真实部分之间的距离:

lib/python2.7/site-packages/scipy/spatial/distance.py:107: ComplexWarning: Casting complex values to real discards the imaginary part
X = X.astype(np.double)
array([ 0.78016544,  0.66201108,  0.8330932 ,  0.54355982,  0.11815436,
        0.05292776,  0.23660562,  0.17108212,  0.11845125,  0.28953338])

scipy.spatial.distance.cdist(A,A)也一样。

是否可以使用 cdist 或 pdist 计算成对距离矩阵或两个输入数组中每对之间的距离,而不使用 for 循环和 scipy.spatial.distance.euclidean,这对我的问题来说太慢了?

【问题讨论】:

  • 出了点问题。在scipy.spatial.distance.euclidean 的第一个示例中,您计算​​两个复杂点之间的距离。另一方面,在pdist 示例中,每个点都有 5 个维度,每个维度都有一个复数。 (维度的 n. 是输入的第二维度的长度,请参阅pdist 的文档)
  • 是的,你说得对,为了清楚起见,我将 A 的维度从 (5,5) 更改为 (5,1),但警告是一样的

标签: python numpy scipy


【解决方案1】:

一个复数的欧几里得范数被定义为该数的模,然后你可以将两个复数之间的距离定义为它们的差的模。

出现警告是因为 pdistcdist 是为 N 维(标量)空间设计的,其中这种距离概念没有任何意义。 (你如何处理许多维度,每个维度都包含一个复数?对于标量很容易,但对于复杂的你有几个选择)

给定两个点集合:

A = numpy.random.uniform(size=(5)) + numpy.random.uniform(size=(5))*1j
B = numpy.random.uniform(size=(5)) + numpy.random.uniform(size=(5))*1j

A各点与B各点的距离可计算为

MA = tile(A[:,newaxis],A.size)
MB = tile(B[:,newaxis],B.size)
dist = abs(MA-MB.T)

例如在dist[2][3] 中,集合的第三个点A 和集合的第四个点B 之间的距离。

这是非常有效的,如果像 @ali_m 在 cmets 中建议的那样一步完成,效果会更好,

dist = np.abs(A[:, None] - B[None, :])

如果您只想要单个集合A 的成对距离矩阵,则可以在上面的代码中将B 替换为A。矩阵dist 将是对称的,并且在对角线上为零。因此,您将在循环中执行大约两倍的操作,并且您将占用大约两倍的所需内存。可能它仍然比带有循环的解决方案更快(也因为使用循环你会遍历成对的数字)

【讨论】:

  • 请注意,不需要平铺输入数组 - 您可以通过使用广播来减少开销和内存占用,例如dist = np.abs(A[:, None] - B[None, :])
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 2017-02-12
  • 2014-04-11
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2014-06-04
  • 2021-05-20
相关资源
最近更新 更多