Каков наилучший способ сохранить размерность при подстановке массивов numpy?

Предположим, у меня был стандартный массив NumPy, такой как

a = np.arange(6).reshape((2,3))

Когда я под массив массива, выполняя такую ​​задачу, как

a[1, :]

Я потеряю размерность, и она превратится в 1D и напечатает, array([3, 4, 5]) Конечно, в списке 2D вы изначально хотите сохранить размерность. Поэтому я должен сделать утомительную задачу, такую ​​как

b=a[1, :]
b.reshape(1, b.size)

Почему NumPy уменьшает размерность при субрейтинге?

Каков наилучший способ сохранить размерность, так как a[1, :].reshape(1, a.size) сломает?

2 ответа

Решение

Просто используйте нарезку вместо индексации, и форма будет сохранена:

a[1:2]

Хотя я согласен с ответом Джона Цвинка, я хотел предоставить альтернативу на тот случай, если по какой-либо причине вы вынуждены использовать индексацию (вместо нарезки).

ОП говорит, что "a[1, :].reshape(1, a.size) сломает":

Вы можете добавить размеры в массивы numpy следующим образом:

b = a[1]
# array([3, 4, 5]
b = a[1][np.newaxis]
# array([[3, 4, 5]])

(Обратите внимание, что np.newaxis является None, но гораздо удобнее использовать np.newaxis)


Как отмечено в комментариях (@PaulPanzer и @Divakar), на самом деле существует много способов сделать то же самое (опять же, с помощью индексации вместо нарезки):

Эти не делают копию (данные меняются в каждом влиянии a)

a[1, None]
a[1, np.newaxis]
a[1].reshape(1, a.shape[1]) # Use shape, not size

Этот действительно делает копию (данные не зависят от a)

a[[1]]
Другие вопросы по тегам