Есть ли в python эквивалент функции MATLAB bsxfun? - PullRequest
20 голосов
/ 20 января 2012

Я пытаюсь перенести часть своего кода из matlab в python, и некоторые из них используют функцию bsxfun () для виртуальной репликации с последующим умножением или делением (я также использую его для логических операций). Я хотел бы иметь возможность сделать это без фактической репликации вектора (либо с помощью функции, либо с некоторой диагональной матрицей) перед умножением или делением, чтобы сэкономить память и время.

Если в какой-либо библиотеке C есть эквивалент bsxfun, это, конечно, также сработает.

Ответы [ 2 ]

4 голосов
/ 17 октября 2014

На самом деле я не знаю эквивалента bsxfun, хотя numpy позаботился о том, чтобы о вас много вещали, как уже упоминали другие.

Это обычно рекламируется как преимуществоnumpy over matlab, и правда, что большая часть вещания проще в numpy, но bsxfun на самом деле более общий, потому что он может принимать пользовательские функции.

Numpy имеет следующее: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html но только на 1 день.

2 голосов
/ 21 июля 2017

Python очень прост в использовании по сравнению с matlab bsxfun (x) в python. Numpy можно легко сделать с помощью ... в массиве [], например, m [...,:] Вы можете попробовать это:

>>>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.]]
...