简单向量操作的优化(python)
在python中,有没有一种快速的方法来执行一个简单的操作,从而生成一个矩阵,使得简单向量操作的优化(python),python,optimization,numpy,Python,Optimization,Numpy,在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,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
问题是这太慢了(数据量会很大)。任何符号的改变都是受欢迎的,如果它能使它更快的话
(顺便问一下,x**2比x*x或同等速度慢吗?试试看
a=arange(1,10)
>>>b=arange(1,10)
>>>a.重塑(9,1)-b.重塑(1,9)
数组([[0,-1,-2,-3,-4,-5,-6,-7,-8],
[ 1, 0, -1, -2, -3, -4, -5, -6, -7],
[ 2, 1, 0, -1, -2, -3, -4, -5, -6],
[ 3, 2, 1, 0, -1, -2, -3, -4, -5],
[ 4, 3, 2, 1, 0, -1, -2, -3, -4],
[ 5, 4, 3, 2, 1, 0, -1, -2, -3],
[ 6, 5, 4, 3, 2, 1, 0, -1, -2],
[ 7, 6, 5, 4, 3, 2, 1, 0, -1],
[ 8, 7, 6, 5, 4, 3, 2, 1, 0]])
被剪断的那一页上发生了什么,请在那一页上寻找解释。如果不惜一切代价避免显式循环,Numpy通常是最快的。谷歌搜索“numpy矢量化”应该可以为您提供这方面的详细信息
翻译成你的例子,完整的公式是
(dx.整形(len(dx),1)-tx.整形(1,len(tx))**2+\
(dy.整形(len(dy),1)-ty.整形(1,len(ty))**2
您希望计算点之间的所有成对平方欧几里德距离。最快的方法是使用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]])
请给出一个最小的数据示例和预期结果。谢谢!工作起来很有魅力。