2012-02-02 115 views
3

我有2個數組(G和G_)。它們具有相同的形狀和大小,我想將它們卷積。我發現了numpy.convolve和fftconvolve。 我的代碼是這樣的:Python scipy.numpy.convolve和scipy.signal.fftconvolve不同的結果

foldedX = getFoldGradientsFFT(G, G_) 
foldedY = getFoldGradientsNumpy(G, G_) 

def getFoldGradientsFFT(G, G_): 
    # convolve via scipy fast fourier transform 
    X =signal.fftconvolve(G,G_, "same) 
    X*=255.0/numpy.max(X); 
    return X 

def getFoldGradientsNumpy(G, G_): 
    # convolve via numpy.convolve 
    Y = ndimage.convolve(G, G_) 
    Y*=255.0/numpy.max(Y); 
    return Y 

但結果是不一樣的。 其結果是這樣的: Numpy.concolve()

[ 11.60287582 3.28262652 18.80395211 52.75829556 99.61675945 
147.74124258 187.66178244 215.06160439 234.1907606 229.04221552] 

scipy.signal.fftconvolve:

[ -4.88130620e-15 6.74371119e-02 4.91875539e+00 1.94250997e+01 
3.88227012e+01 6.70322921e+01 9.78460423e+01 1.08486302e+02 
1.17267015e+02 1.15691562e+02] 

我想的結果被認爲是相同的,即使這兩個函數卷積用一個不同的程序?!


我忘了提,即我想卷積2 2維數組:S 陣列:

G = array([[1,2],[3,4]]) 
G_ = array([[5,6],[7,8]]) 

代碼

def getFoldGradientsFFT(G, G_): 
    X =signal.fftconvolve(G,G_,"same") 
    X=X.astype("int") 
    X*=255.0/np.max(X); 
    return X 

def getFoldGradientsNumpy(G, G_): 
    # convolve via convolve 
    old_shape = G.shape 
    G = np.reshape(G, G.size) 
    G_ = np.reshape(G_, G.size) 
    Y = np.convolve(G, G_, "same") 
    Y = np.reshape(Y,old_shape) 
    Y = Y.astype("int") 
    Y*=255.0/np.max(Y); 
    return Y 

def getFoldGradientsNDImage(G, G_): 
    Y = ndimage.convolve(G, G_) 
    Y = Y.astype("int") 
    Y *= 255.0/np.max(Y) 
    return Y 

結果:

getFoldGradientsFFT 
[[ 21 68] 
[ 93 255]] 

getFoldGradientsNumpy 
[[ 66 142] 
[250 255]] 

getFoldGradientsNDImage 
[[147 181] 
[220 255]] 

回答

3

getFoldGradientsNumpy正在使用scipy.ndimage.convolve。這是多維卷積,與scipy.convolve不一樣。

對於我來說,當卷積兩個一維數組scipy.convolve,scipy.signal.convolvescipy.signal.fftconvolve都會返回相同的答案。

5

numpy.convolve適用於一維數據。

以下代碼比較了signal.convolve,signal.fftconvolve和ndimage.convolve的結果。對於ndimage.convolve,我們需要將模式參數設置爲「常量」,當N爲偶數時,將參數設置爲-1,當N爲奇數時,將參數設置爲0。

from scipy import signal 
from scipy import ndimage 
import numpy as np 

np.random.seed(1) 

for N in xrange(2, 20): 
    a = np.random.randint(0, 10, size=(N, N)) 
    b = np.random.randint(0, 10, size=(N, N)) 

    r1 = signal.convolve(a, b, mode="same") 
    r2 = signal.fftconvolve(a, b, mode="same") 
    r3 = ndimage.convolve(a, b, mode="constant", origin=-1 if N%2==0 else 0) 
    print "N=", N 
    print np.allclose(r1, r2) 
    print np.allclose(r2, r3)