23

最初の軸の次元が同じ2つの2次元配列があります。Pythonでは、2番目の軸に沿って2つの行列のみを畳み込みたいと思います。C最初の軸に沿った畳み込みも計算せずに、以下に進みたいと思います。

import numpy as np
import scipy.signal as sg

M, N, P = 4, 10, 20
A = np.random.randn(M, N)
B = np.random.randn(M, P)

C = sg.convolve(A, B, 'full')[(2*M-1)/2]

速い方法はありますか?

4

4 に答える 4

3

2D 配列の場合、関数 scipy.signal.convolve2d はより高速であり、scipy.signal.fftconvolve はさらに高速になる可能性があります (配列の次元によって異なります)。

ここで、N = 100000 の同じコード

import time    
import numpy as np
import scipy.signal as sg

M, N, P = 10, 100000, 20
A = np.random.randn(M, N)
B = np.random.randn(M, P)

T1 = time.time()
C = sg.convolve(A, B, 'full')
print(time.time()-T1)

T1 = time.time()
C_2d = sg.convolve2d(A, B, 'full')
print(time.time()-T1)

T1 = time.time()
C_fft = sg.fftconvolve(A, B, 'full')
print(time.time()-T1)

>>> 12.3
>>> 2.1
>>> 0.6

答えはすべて同じですが、使用される計算方法が異なるため、わずかな違いがあります (たとえば、fft と直接乗算ですが、正確な convolve2d が何を使用するかはわかりません)。

print(np.max(np.abs(C - C_2d)))
>>>7.81597009336e-14

print(np.max(np.abs(C - C_fft)))
>>>1.84741111298e-13
于 2016-11-08T11:29:37.663 に答える