Есть ли эквивалент функции MATLAB bsxfun в python?
Я пытаюсь перенести часть моего кода из matlab в python, а в некоторых из них используется функция bsxfun() для виртуальной репликации с последующим умножением или делением (я также использую ее для логических операций). Я хотел бы иметь возможность сделать это без фактической репликации вектора (либо с помощью функции, либо с помощью какой-либо диагональной матрицы) перед умножением или делением на сохранение памяти и времени.
Если в библиотеке C есть эквивалент bsxfun, это, конечно же, будет работать.
Ответы
Ответ 1
На самом деле нет эквивалента bsxfun, о котором я знаю, хотя numpy действительно заботится о большом вещании для вас, как говорили другие.
Это обычно рекламируется как преимущество numpy над matlab, и верно, что много вещания проще в numpy, но bsxfun на самом деле более общий, поскольку он может принимать пользовательские функции.
У Numpy есть следующее:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html
но только для 1d.
Ответ 2
Python очень прост в использовании по сравнению с Matlab
bsxfun (x) в python numpy можно легко выполнить с помощью... в массиве [], например. м [...:]
Вы можете попробовать следующее:
>>>m = np.zeros([5,13], dtype=np.float32)
>>>print(m)
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
>>>c=np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13]])
>>>print(m[...,:] +4*c)
[[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]
[ 4. 8. 12. 16. 20. 24. 28. 32. 36. 40. 44. 48. 52.]]