вопрос об изменении формы (сравнение Matlab) - PullRequest
2 голосов
/ 24 марта 2019

Скажем, у меня есть 1-D вектор с именем s, состоящий из 0,3,6,9.

В MATLAB форма обозначена (1,4). то есть вектор строки 1х4.

Но в форме numy форма дается как (4,). Зачем? Разве это обозначение не должно обозначать вектор 4x1, так как python также использует соглашение о строке x col?

Теперь, если я хочу изменить вектор строки, в MATLAB я бы набрал reshape (s, [4,1]), чтобы получить вектор столбца.

Я бы предположил, что стандартная запись для эквивалентной операции - s.reshape (4,1). Но в документации я вижу s.reshape (-1,1). Зачем? Один синтаксис лучше другого? Что означает -1 в этом контексте?

1 Ответ

2 голосов
/ 24 марта 2019

Отойдите от numpy на мгновение и посмотрите на списки Python:

In [165]: alist = [0,3,6,9]                                                     
In [166]: alist                                                                 
Out[166]: [0, 3, 6, 9]
In [167]: alist[1]                                                              
Out[167]: 3

Это 3 - скаляр;Я получил бы ошибку, если бы попытался проиндексировать ее, alist[1][0].

Теперь создайте список списков:

In [168]: alist = [[0],[3],[6],[9]]                                             
In [169]: alist                                                                 
Out[169]: [[0], [3], [6], [9]]
In [170]: alist[1]                                                              
Out[170]: [3]
In [171]: alist[1][0]                                                           
Out[171]: 3

Я могу проиндексировать его дважды.

В Октаве MATLAB

>> x = [0,3,6,9];
>> x(2)
ans =  3
>> size(x)
ans =
   1   4

>> size(x(2))
ans =
   1   1

x(2) для бедняков все еще является двумерной матрицей;Я мог бы индексировать это до бесконечности, x(2)(1)(1)(1).Размер сам по себе является двумерной матрицей;в MATLAB все равно 2d (или выше).

>> size(size(x))
ans =
   1   2

Назад в Python / numpy:

In [172]: arr = np.array([0,3,6,9])                                             
In [173]: arr.shape                                                             
Out[173]: (4,)             # a 1 element tuple

In [175]: arr[1]                                                                
Out[175]: 3
In [176]: type(Out[175])                                                        
Out[176]: numpy.int64
In [177]: Out[175].shape                                                        
Out[177]: ()

Результатом индексации элемента этого массива 1d является пустой скалярный объект,с формой 0d.https://docs.scipy.org/doc/numpy/reference/arrays.scalars.html

Судя по многим вопросам, у пользователей MATLAB возникают проблемы с представлением массива с 1 или даже 0 измерениями.Эта нижняя 2d граница полностью укоренилась в их мышлении.Это также кажется основополагающим для некоторых (если не всех) версий линейной алгебры.Существуют матрицы, векторы строк и столбцы, но не простые векторы.

Но numpy работает в Python, и поведение его массивов соответствует спискам Python.И логически согласуется с самим собой.

Вот как выглядят вектор 'column' и вектор 'row'.Обратите внимание на формы - оба кортежа из двух элементов.И вложение скобок (2 уровня).Сходство с вложенным списком является преднамеренным.

In [178]: arr = np.array([[0],[3],[6],[9]])                                     
In [179]: arr.shape                                                             
Out[179]: (4, 1)
In [180]: arr                                                                   
Out[180]: 
array([[0],
       [3],
       [6],
       [9]])
In [181]: arr = np.array([[0,3,6,9]])                                           
In [182]: arr.shape                                                             
Out[182]: (1, 4)
In [183]: arr                                                                   
Out[183]: array([[0, 3, 6, 9]])
...