Не anwer; просто комментарий:
Прежде чем сравнивать производительность, вам необходимо убедиться, что обе функции возвращают один и тот же результат:
Если CONVN MatLab возвращает тот же результат, как CONVN Октава, то 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
«s по умолчанию.
Для 2D массивов, 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))
создает поплавка массива по умолчанию. Кажется, что Matlab ones(n,m,p)
создает массив ints. Чтобы сделать хорошее сравнение, вы должны попытаться сопоставить dtype массивов numpy с типом Matlab-матриц.
На самом деле это не игра Python, вы здесь, но NumPy/SciPy. Можете ли вы улучшить производительность этих модулей? Конечно, но не написав код Python. – kindall
Отредактировано (с/Python/Numpy /). – naroom
Вы можете посмотреть, какие библиотеки numpy построены против vs matlab. По личному опыту я знаю, что, когда numpy создается против библиотеки Intel MKL, я получаю намного лучшую производительность для некоторых операций, чем с настройками по умолчанию. – JoshAdel