我正在运行代码来生成一个掩码,其中B中的位置比a中的某个距离D更近
N = [[0 for j in range(length_B)] for i in range(length_A)]
dSquared = D*D
for i in range(length_A):
for j in range(length_B):
if ((A[j][0]-B[i][0])**2 + (A[j][1]-B[i][1])**2) <= dSquared:
N[i][j] = 1
对于包含数万个位置的A和B列表,此代码需要一段时间。我很确定有一种方法可以将它矢量化,使它运行得更快。谢谢您。在
您可以使用^{} ,它对于这种距离计算是非常有效的,比如-
正如^{} 中所建议的那样,也可以使用
^{pr2}$broadcasting
。现在,从问题中发布的代码来看,我们处理的是Nx2
形状的数组。因此,我们基本上可以对第一列和第二列进行切片,并分别对它们执行广播减法。这样做的好处是,我们不会继续使用3D
,因此可以保持它的内存效率,这也可以转化为性能提升。因此,平方欧几里德距离的计算如下-让我们来计算欧几里德距离平方的这三种方法。在
运行时测试-
使用二维数组索引可以更容易地可视化此代码:
这个
^{pr2}$dist
表达式看起来像对于2个元素,这个数组表达式可能不会更快,但它应该有助于我们重新思考问题。在
我们可以用广播来执行
i,j
,outter
问题将其与
dSquared
进行比较,并使用生成的布尔数组作为掩码,将N
的元素设置为1:我还没有测试过这段代码,所以可能有一些bug,但我认为基本思想已经存在了。也许你的思考过程足够让你为其他的案例找出细节。在
我支持上面使用Numpy的建议。循环代码在a中的索引也比它需要的多得多。您可以使用类似于:
要想从纯Python中获得良好的性能是相当困难的。我也会指出,更维的阵列解决方案将需要一个。。。很多。。。记忆。在
相关问题 更多 >
编程相关推荐