Отойдите от 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]])