2015-08-27 2 views
2

Недавно я переключился с Matlab/Octave на SciPy/NumPy, и мне это нравится. Но я обнаружил, что иногда меня путают из-за тонких различий.В NumPy, np.array ([1, 2, 3, 4, 5]) отличается от np.array ([[1], [2], [3], [4], [5]])?

В Matlab, когда мы объявить «вектор-строку» размером 5, то мы используем следующую команду:

x = [1, 2, 3 ,4, 5] % in matlab 

Величина этого вектора может быть проверена с помощью команды «size», как показано ниже, :

size(x) 

ans = 

    1  5 

Я предположил, что следующее в NumPy делает то же, что и выше.

x = np.array([1, 2, 3, 4, 5]) # in NumPy 

Но размер несколько странный.

>>> np.shape(x) 
(5,) 

Размер не (5, 1), но это (5,). Что это значит? Я не совсем уверен, почему второй элемент этого кортежа пуст.

Я проверил, что следующие возвращает (5, 1)

y = np.array([[1], [2], [3], [4], [5]]) 
np.shape(y) 
(5, 1) 

Тогда это "у" такой же, как "х" в NumPy? Я предполагаю, что это не так. Возможно, я что-то недопонимаю, но мог ли кто-нибудь просветить меня по этой теме?

Спасибо!

+3

В MATLAB матрица имеет по крайней мере два измерения (лет назад это было ровно 2). В numpy массив может иметь любое число - 0, 1, 2 и т. Д. Еще одна существенная разница - размеры массива MATLAB 'в конце, следовательно, форма '(5,1)'. numpy добавляет их в начале - при необходимости. – hpaulj

+0

Спасибо за комментарий! Но я думаю, что неверно, что размер массива MATLAB «прокладки» в конце. Как вы упомянули, в Matlab матрица имеет 2-мерную размерность, а вектор считается специальным типом матриц с размерностью N x 1 или 1 X N. Таким образом, размер вектора строки становится [1, N ]. Если это вектор-столбец, размер становится [N, 1]. – chanwcom

+0

Если я попрошу измерение «10-го», у меня нет проблем с опросом меня «1':' size (1: 10,10) '. – hpaulj

ответ

7

Форма массива NumPy всегда является кортежем. (5) не является кортежем, так как Python оценивает его как число 5. Чтобы получить кортеж, нужно добавить запятую после 5, как в (5,). Таким образом, (5,) является кортеж, содержащий 1 значение, то число 5 и (5, 1) является кортеж, содержащий 2 значения, число 5 и 1.

Количество элементов в наборе равна размеры чисел массива. В NumPy lingo размеры также называются «осями». Так

x = np.array([1, 2, 3, 4, 5]) 

представляет собой массив из формы (5,), и она имеет 1 измерение.

В противоположность этому,

y = np.array([[1], [2], [3], [4], [5]]) 

является массивом формы (5, 1) и имеет 2 размеры. Таким образом, x и y не совпадают.


Обратите внимание на NumPy жаргоне, «размер» или массив относится к числу значений в массиве:

In [48]: x.size 
Out[48]: 5 

In [49]: y.size 
Out[49]: 5 

Numpy массивы могут "broadcast" их значения, чтобы действовать как массивы более высокий размер.Поскольку трансляция может добавлять новые оси влево формы массива, массив формы (5,) может транслироваться до формы (1, 5).

Поскольку для двумерных массивов первая ось может считаться соответствующей строкам, а вторая ось - столбцами, одномерный массив, такой как x, может вести себя как массив из 1 строки, 5-столбцов - т.е. вектор строки. y имеет форму (5, 1), которая делает ее 5-строчной, 1-колоночной матрицей, то есть вектором столбца.

Если добавить массив формы (1, 5) (т.е. вектор строка) с массивом формы (5, 1) (т.е. вектор-столбец), правила вещания создает массив формы (5, 5):

In [60]: x + y 
Out[60]: 
array([[ 2, 3, 4, 5, 6], 
     [ 3, 4, 5, 6, 7], 
     [ 4, 5, 6, 7, 8], 
     [ 5, 6, 7, 8, 9], 
     [ 6, 7, 8, 9, 10]]) 

Если вы хотите, чтобы x действовал как вектор-столбец, вам нужно будет добавить новую ось справа. Трансляция никогда не делает этого, поэтому вам нужно сделать это вручную с помощью x[:, np.newaxis]. Добавление двух векторов-столбцов производит другой вектор-столбец:

In [61]: x[:, np.newaxis].shape 
Out[61]: (5, 1) 

In [56]: x[:, np.newaxis] + y 
Out[56]: 
array([[ 2], 
     [ 4], 
     [ 6], 
     [ 8], 
     [10]]) 
Смежные вопросы