Итерация по массиву аналогична итерации по списку списков - она возвращает элементы, проиндексированные по первому измерению:
In [48]: X = np.random.randn(5, 2)
In [49]: X[0,:]
Out[49]: array([0.59964924, 0.46057338])
In [50]: for row in X:print(row)
[0.59964924 0.46057338]
[1.09308258 0.06495922]
[ 0.98928476 -1.07894574]
[-1.31303644 -0.34589506]
[0.31475676 0.3003112 ]
Вы можете выполнять итерации по индексам и использовать индекс списка:
In [51]: for i in range(X.shape[0]): print(X[[i],:])
[[0.59964924 0.46057338]]
[[1.09308258 0.06495922]]
[[ 0.98928476 -1.07894574]]
[[-1.31303644 -0.34589506]]
[[0.31475676 0.3003112 ]]
X[[1]]
, X[1:2]
, X[1][None,:]
, X[None,1]
все делают то же самое.
Я не думаю, что есть способ объединить их непосредственно в
for ... in X:
выражение.
nditer
может быть неудобно использовать.Обычно он повторяется на уровне элемента, а не на уровне строки, давая нам массив 0d.И это не быстрее, чем for
итерация.Поэтому я не думаю, что это полезно здесь.
====
Ссылка на подсказку, Кусок индексного фрагмента без потери информации о размерах , вдохновил меня попробовать:
In [57]: for row in X[:,None]: print(row)
[[0.59964924 0.46057338]]
[[1.09308258 0.06495922]]
[[ 0.98928476 -1.07894574]]
[[-1.31303644 -0.34589506]]
[[0.31475676 0.3003112 ]]
Фактически я превращаю X
в массив (5,1,2), поэтому итерация первого измерения создает (1,2) элементов.Вместо того, чтобы сохранить измерение, я добавляю его.