16

我正在尝试使用 Python 和 Numpy/Scipy 来实现图像处理算法。分析器告诉我很多时间都花在了以下函数(经常调用)上,它告诉我两个图像之间的平方差之和

def ssd(A,B):
    s = 0
    for i in range(3):
        s += sum(pow(A[:,:,i] - B[:,:,i],2))
    return s

我怎样才能加快速度?谢谢。

4

7 回答 7

48

只是

s = numpy.sum((A[:,:,0:3]-B[:,:,0:3])**2)

sum((A-B)**2)(如果形状总是(,,,3 ) ,我预计很可能)

您还可以使用 sum 方法:((A-B)**2).sum()

正确的?

于 2010-02-17T21:47:11.273 回答
5

只是提到一个也可以使用np.dot

def ssd(A,B):
  dif = A.ravel() - B.ravel()
  return np.dot( dif, dif )

这可能比使用np.sumand的替代方法更快并且可能更准确**2,但如果您想沿指定轴计算 ssd,则不起作用。在这种情况下,可能会有一个神奇的下标公式使用np.einsum.

于 2019-10-28T10:16:09.263 回答
2

我很困惑你为什么要服用i in range(3)。那应该是整个阵列,还是只是一部分?

总的来说,您可以用 numpy 中定义的操作替换其中的大部分内容:

def ssd(A,B):
    squares = (A[:,:,:3] - B[:,:,:3]) ** 2
    return numpy.sum(squares)

这样,您可以执行一项操作而不是三项操作,并且 usingnumpy.sum可以比 builtin 更好地优化添加sum

于 2010-02-17T21:50:06.223 回答
1

进一步 Ritsaert Hornstra 的回答得到了 2 个负分(诚然,我没有看到它的原始形式......)

这是真的。

对于大量迭代,使用 '**' 运算符或 pow(x,y) 方法通常需要两倍的时间,而只是手动将这些对相乘。如果有必要使用 math.fabs() 方法,如果它抛出 NaN (它有时尤其是在使用 int16s 等时),它仍然只需要给定两个函数的大约一半时间。

对我知道的原始问题并不重要,但绝对值得知道。

于 2010-02-23T15:41:22.163 回答
1

我不知道 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
于 2010-02-17T21:47:52.147 回答
-1

你可以试试这个:

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

于 2018-04-27T15:56:38.823 回答
-3

在 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
于 2015-01-29T11:54:14.157 回答