Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单向量操作的优化(python)_Python_Optimization_Numpy - Fatal编程技术网

简单向量操作的优化(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):

在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
问题是这太慢了(数据量会很大)。任何符号的改变都是受欢迎的,如果它能使它更快的话

(顺便问一下,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]])

请给出一个最小的数据示例和预期结果。谢谢!工作起来很有魅力。