Использование np.matrix
не рекомендуется, если не считается устаревшим. Это редко требуется, за исключением некоторых случаев обратной совместимости.
In [1]: arr = np.zeros((5,5))
In [2]: arr
Out[2]:
array([[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.]])
In [3]: mat = np.matrix(arr)
In [4]: mat
Out[4]:
matrix([[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.]])
Индексирование одной строки arr
создает массив 1d
In [5]: arr[2]
Out[5]: array([0., 0., 0., 0., 0.])
Индексирование одной строки mat
создает 2d матрица с формой (1,5)
In [6]: mat[2]
Out[6]: matrix([[0., 0., 0., 0., 0.]])
Мы можем получить доступ к элементу в массиве 1d:
In [7]: arr[2][1]
Out[7]: 0.0
, но это индексирование mat
пытается получить доступ к строка и выдает ошибку:
In [8]: mat[2][1]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-8-212ad5378f8e> in <module>
----> 1 mat[2][1]
...
IndexError: index 1 is out of bounds for axis 0 with size 1
В обоих случаях лучше получить доступ к элементу с синтаксисом кортежа, чем к цепочечному:
In [9]: arr[2,1]
Out[9]: 0.0
In [10]: mat[2,1]
Out[10]: 0.0
Это индексирование также работает для установки значений. Но старайтесь избегать повторения, чтобы установить отдельные значения. Попробуйте найти способы создания целого массива с нужными значениями напрямую, с помощью целых методов массива, а не итерации.