Не ответ; просто комментарий:
Прежде чем сравнивать производительность, нужно убедиться, что две функции возвращают один и тот же результат:
Если convn Matlab возвращает тот же результат, что и convn Octave, то convn
отличается от ndimage.convolve
:
octave> convn(ones(3,3), ones(2,2))
ans =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
In [99]: ndimage.convolve(np.ones((3,3)), np.ones((2,2)))
Out[99]:
array([[ 4., 4., 4.],
[ 4., 4., 4.],
[ 4., 4., 4.]])
ndimage.convolve
имеет другие режимы, 'reflect','constant','nearest','mirror', 'wrap'
, но ни один из них не соответствует поведению convn
по умолчанию ("полному").
Для двумерных массивов scipy.signal.convolve2d
быстрее, чем scipy.signal.convolve
.
Для 3D-массивов scipy.signal.convolve
ведет себя так же, как convn(A,B)
:
octave> x = convn(ones(3,3,3), ones(2,2,2))
x =
ans(:,:,1) =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
ans(:,:,2) =
2 4 4 2
4 8 8 4
4 8 8 4
2 4 4 2
ans(:,:,3) =
2 4 4 2
4 8 8 4
4 8 8 4
2 4 4 2
ans(:,:,4) =
1 2 2 1
2 4 4 2
2 4 4 2
1 2 2 1
In [109]: signal.convolve(np.ones((3,3,3), dtype='uint8'), np.ones((2,2,2), dtype='uint8'))
Out[109]:
array([[[1, 2, 2, 1],
[2, 4, 4, 2],
[2, 4, 4, 2],
[1, 2, 2, 1]],
[[2, 4, 4, 2],
[4, 8, 8, 4],
[4, 8, 8, 4],
[2, 4, 4, 2]],
[[2, 4, 4, 2],
[4, 8, 8, 4],
[4, 8, 8, 4],
[2, 4, 4, 2]],
[[1, 2, 2, 1],
[2, 4, 4, 2],
[2, 4, 4, 2],
[1, 2, 2, 1]]], dtype=uint8)
Обратите внимание, что np.ones((n,m,p))
по умолчанию создает массив float. Matlab ones(n,m,p)
создает массив целых чисел. Чтобы сделать хорошее сравнение, вы должны попытаться сопоставить dtype массивов numpy с типом матриц Matlab.
person
unutbu
schedule
23.05.2013
tic toc
НЕ подходит для измерения производительности. Используйте классtimeit
в numpy и, например, его аналог из fileexchange для MATLAB. В документации вы также найдете некоторые индикаторы того, что неправильно использовать простоtic toc
. - person Jan   schedule 23.05.2013ndimage
не делает кучу звонков BLAS, если я правильно помню. - person Joe Kington   schedule 23.05.2013