我正在尝试使用 Python 和 Numpy/Scipy 来实现图像处理算法。分析器告诉我很多时间都花在了以下函数(经常调用)上,它告诉我两个图像之间的平方差之和
def ssd(A,B):
s = 0
for i in range(3):
s += sum(pow(A[:,:,i] - B[:,:,i],2))
return s
我怎样才能加快速度?谢谢。
我正在尝试使用 Python 和 Numpy/Scipy 来实现图像处理算法。分析器告诉我很多时间都花在了以下函数(经常调用)上,它告诉我两个图像之间的平方差之和
def ssd(A,B):
s = 0
for i in range(3):
s += sum(pow(A[:,:,i] - B[:,:,i],2))
return s
我怎样才能加快速度?谢谢。
只是
s = numpy.sum((A[:,:,0:3]-B[:,:,0:3])**2)
sum((A-B)**2)
(如果形状总是(,,,3 ) ,我预计很可能)
您还可以使用 sum 方法:((A-B)**2).sum()
正确的?
我很困惑你为什么要服用i in range(3)
。那应该是整个阵列,还是只是一部分?
总的来说,您可以用 numpy 中定义的操作替换其中的大部分内容:
def ssd(A,B):
squares = (A[:,:,:3] - B[:,:,:3]) ** 2
return numpy.sum(squares)
这样,您可以执行一项操作而不是三项操作,并且 usingnumpy.sum
可以比 builtin 更好地优化添加sum
。
进一步 Ritsaert Hornstra 的回答得到了 2 个负分(诚然,我没有看到它的原始形式......)
这是真的。
对于大量迭代,使用 '**' 运算符或 pow(x,y) 方法通常需要两倍的时间,而只是手动将这些对相乘。如果有必要使用 math.fabs() 方法,如果它抛出 NaN (它有时尤其是在使用 int16s 等时),它仍然只需要给定两个函数的大约一半时间。
对我知道的原始问题并不重要,但绝对值得知道。
我不知道 power 2 的 pow() 函数是否会很快。尝试:
def ssd(A,B):
s = 0
for i in range(3):
s += sum((A[:,:,i] - B[:,:,i])*A[:,:,i] - B[:,:,i])
return s
你可以试试这个:
dist_sq = np.sum((A[:, np.newaxis, :] - B[np.newaxis, :, :]) ** 2, axis=-1)
可以在此处找到更多详细信息(“k-Nearest Neighbors”示例): https ://jakevdp.github.io/PythonDataScienceHandbook/02.08-sorting.html
在 Ruby 语言中,您可以通过这种方式实现此目的
def diff_btw_sum_of_squars_and_squar_of_sum(from=1,to=100) # use default values from 1..100.
((1..100).inject(:+)**2) -(1..100).map {|num| num ** 2}.inject(:+)
end
diff_btw_sum_of_squars_and_squar_of_sum #call for above method