Каков наилучший способ сохранить размерность при подстановке массивов 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]]