gpt4 book ai didi

python - 简单向量运算的优化(python)

转载 作者:行者123 更新时间:2023-11-28 21:53:25 25 4
gpt4 key购买 nike

在 python 中,有没有一种快速的方法来执行一个简单的操作,得到一个矩阵,这样 A[i,j] = a[i] - b[j]给定两个数组 a 和 b(长度相同,但这可能不相关)?

更准确地说,我拥有的是二维空间中的 N 个点,其位置存储在两个数组 dx 和 dy 中,以及另外 N 个点的位置在 tx 和 ty 中。我需要一个矩阵

A[i,j] = (dx[j]-tx[i])**2+(dy[j]-ty[i])**2

我唯一想到的就是做

A = np.empty([nData,nData])
for i in range(nData):
A[i] = (dx-tx[i])**2+(dy-ty[i])**2
return A

问题是这太慢了(nData 会很大)。如果可以加快速度,欢迎对符号进行任何更改。

(顺便问一下,x**2 是否比 x*x 或等价物慢?)

最佳答案

您想计算点之间的所有成对平方欧氏距离。最快的方法是使用 scipy.distance.cdist:

>>> import numpy as np
>>> from scipy.spatial.distance import cdist
>>> x = np.random.rand(10, 2)
>>> t = np.random.rand(8, 2)

>>> cdist(x, t, 'sqeuclidean')
array([[ 0.61048982, 0.04379578, 0.30763149],
[ 0.02709455, 0.30235292, 0.25135934],
[ 0.21249888, 0.14024951, 0.28441688],
[ 0.39221412, 0.01994213, 0.17699239]])

如果你想在 numpy 中自己做。像这样的东西应该可以解决问题:

>>> np.sum((x[:, None] - t)**2, axis=-1)
array([[ 0.61048982, 0.04379578, 0.30763149],
[ 0.02709455, 0.30235292, 0.25135934],
[ 0.21249888, 0.14024951, 0.28441688],
[ 0.39221412, 0.01994213, 0.17699239]])

或者,对 x 和 y 坐标使用单独的数组:

>>> dx, dy = x.T
>>> tx, ty = t.T

>>> (dx[:, None] - tx)**2 + (dy[:, None] - ty)**2
array([[ 0.61048982, 0.04379578, 0.30763149],
[ 0.02709455, 0.30235292, 0.25135934],
[ 0.21249888, 0.14024951, 0.28441688],
[ 0.39221412, 0.01994213, 0.17699239]])

关于python - 简单向量运算的优化(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26430168/

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