Python 高效快速的二维阵列函数调用
我有一个2d numpy对象数组:Python 高效快速的二维阵列函数调用,python,arrays,optimization,numpy,Python,Arrays,Optimization,Numpy,我有一个2d numpy对象数组:a和一个numpy值数组:l(nx2数组) 2d numpy对象数组中的每个元素都有两个值,例如[ax1,ay1],对于l,也有类似的值 我调用自己的距离函数,计算l的第一个元素与A中的每个元素之间的距离,然后取最小距离。循环如下所示: for r in range(A.shape[0]): for s in range(A.shape[1]): lencent = l.shape[0] dist = []
a
和一个numpy值数组:l
(nx2数组)
2d numpy对象数组中的每个元素都有两个值,例如[ax1,ay1],对于l
,也有类似的值
我调用自己的距离函数,计算l的第一个元素与A中的每个元素之间的距离,然后取最小距离。循环如下所示:
for r in range(A.shape[0]):
for s in range(A.shape[1]):
lencent = l.shape[0]
dist = []
for p in range(lencent):
dist.append(distancefunction(A[r,s],A[r,s],l[p,0],l[p,1]))
#print dist
val = np.min(dist)
#print val
tempimg[r,s] = val
但是,当numpy数组A较大或l较大,或两者都较大时,这需要花费大量时间。是否有任何pythonic方法来优化此循环的性能?使用NumPy(如果可能)使此双循环更快,很可能需要查看
距离函数的定义。计算W2 distance()是一个复杂的函数NumPy对象数组比NumPy浮点数组慢。它们甚至可能比Python列表还要慢。Python循环通常比等价的NumPy函数调用慢。在上面的例子中,您只在一个地方使用了NumPy:np.min
。为了使用NumPy获得更好的性能,您需要将更多的工作卸载到NumPy函数调用。由于在您发布的代码中没有太多这样做的机会,因此唯一可以改进的地方是重写distance function
,以接受A
和l
作为输入,并返回结果数组,而不是一次只返回一个数字;您可以提供distancefunction代码,因此如果可能,我们可以建议其基于numpy的计算,或者其他改进。这是提高性能的唯一可能。正如评论所建议的,我将放弃这个问题并发布一个新问题。发布distance函数
,询问如何使其针对numpy进行优化。如果它涉及阵列操作(以及查找和def,当然可能),您会注意到一个很大的加速。