Просто любопытно, что получится от функции NumPy! - PullRequest
2 голосов
/ 12 ноября 2009

Я использовал NumPy для магистерской работы. Я преобразовал части кода из кода MATLAB, но у меня есть сомнения в NumPy / Python, когда я ссылаюсь:

m = numpy.ones((10,2))
m[:,0]

, который возвращает:

array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

и когда я ссылаюсь на:

m[:,0:1]

возвращает:

array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])

что, я думаю, должно быть, вызвать тот же результат с MATLAB !!!

Ответы [ 3 ]

5 голосов
/ 12 ноября 2009

Это потому, что у numpy есть концепция 1d-массивов, которых нет у Matlab. В сочетании с numpys broadcasting это обеспечивает мощное упрощение (меньше беспокойства о вставке транспонирования повсюду), но означает, что вам нужно немного подумать о переводе из Matlab. В этом случае извлечение одного столбца с помощью скалярного Numpy упрощает результат до 1d массива, но со срезом сохраняет исходные размеры. Если вы хотите остаться ближе к семантике Matlab, вы можете попробовать использовать класс Matrix. См. Страницу NumPy для пользователей Matlab для подробностей. В этом случае вы можете выполнить одно из следующих действий:

m[:,0][:,newaxis] # gives same as matlab
np.matrix(m)[:,0] # gives same as matlab

Но помните, что если вы используете матричный класс, * становится умножением матриц, и вам нужно использовать multiply() для поэлементного. (Все это описано на странице NumPy для пользователей Matlab). Как правило, я бы порекомендовал попытаться привыкнуть к использованию 1d-массивов, где у вас был бы вектор-столбец или строка в matlab, и в целом все просто работает. Вам нужно беспокоиться только о столбце и строке при их повторной сборке в 2d массив.

Возможно, вас заинтересуют автоматические конвертеры matlab в python, такие как OMPC (бумага) (думаю, есть и другие).

3 голосов
/ 12 ноября 2009

Я все еще изучаю Python, но я думаю, что способ нарезки заключается в том, что индексы указывают на промежуточные местоположения, поэтому 0:1 получает только первый столбец. Это то, о чем ты спрашивал?

Вот что говорит документация :

Один из способов помнить, как работают ломтики думать об индексах как о указывающих между символами, с левым краем первого символа с номером 0. Тогда правый край последнего символ строки из n символов имеет индекс n, например:

 +---+---+---+---+---+
 | H | e | l | p | A |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1
0 голосов
/ 12 ноября 2009

Я забыл, что делает numpy, но Matlab индексирует векторы от 1, а не от 0. Поэтому array (:, 0) - ошибка в Matlab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...