gpt4 book ai didi

python - 复数数组上的 scipy cdist 或 pdist

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:34 32 4
gpt4 key购买 nike

使用 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 这是对我的问题来说太慢了吗?

最佳答案

复数的欧几里德范数定义为该数的模,然后您可以将两个复数之间的距离定义为其差的模。

警告是因为 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 在评论中建议的那样一步完成,效率会更高,

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

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

关于python - 复数数组上的 scipy cdist 或 pdist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21938189/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com