Итерация массива NumPy и сохранение размеров - PullRequest
2 голосов
/ 21 мая 2019

Я хотел бы перебрать двумерный массив (особенно с помощью nditer) и сохранить количество измерений в повторяющемся массиве. При этом я хотел бы избежать каких-либо операций с повторяющимися элементами. Решение должно быть установлено только один раз либо для повторного массива, либо для итератора.

import numpy as np

X = np.random.randn(5, 2)

for row in X:
    print(row.shape)

>>> (2,)
(2,)
(2,)
(2,)
(2,)

Однако я хотел бы иметь:

>> (1, 2)
(1, 2)
(1, 2)
(1, 2)
(1, 2)

Я бы хотел найти решение, которое можно применить только один раз, а не для каждой строки, например row = row.reshape(1,-1).

1 Ответ

1 голос
/ 21 мая 2019

Итерация по массиву аналогична итерации по списку списков - она ​​возвращает элементы, проиндексированные по первому измерению:

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) элементов.Вместо того, чтобы сохранить измерение, я добавляю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...