【发布时间】: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),但警告是一样的