Мое понимание заключается в том, что 1-D массивы в numpy могут быть интерпретированы как вектор, ориентированный на столбцы, или вектор, ориентированный на строку. Например, одномерный массив с формой (8,)
можно рассматривать как 2-мерный массив формы (1,8)
или shape (8,1)
в зависимости от контекста.
Проблема, с которой я сталкиваюсь, заключается в том, что функции, которые я пишу для манипулирования массивами, имеют тенденцию хорошо обобщаться в двумерном случае для обработки как векторов, так и матриц, но не так хорошо в 1-D случае.
Таким образом, мои функции в конечном итоге делают что-то вроде этого:
if arr.ndim == 1:
# Do it this way
else:
# Do it that way
Или даже это:
# Reshape the 1-D array to a 2-D array
if arr.ndim == 1:
arr = arr.reshape((1, arr.shape[0]))
# ... Do it the 2-D way ...
То есть, я нахожу, что могу обобщать код для обработки двумерных случаев (r,1)
, (1,c)
, (r,c)
, но не в 1-D случаях без разветвления или изменения.
Он становится еще более уродливым, когда функция работает на нескольких массивах, так как я бы проверял и преобразовывал каждый аргумент.
Итак, мой вопрос: я пропустил какую-то лучшую идиому? Является ли описанный выше шаблон типичным для numpy-кода?
Кроме того, в качестве связанного аспекта принципов проектирования API, если вызывающий абонент передает 1-мерный массив некоторой функции, которая возвращает новый массив, а возвращаемое значение также является вектором, является ли распространенной практикой изменять 2- D vector (r,1)
или (1,c)
вернуться к 1-D массиву или просто документировать, что функция возвращает 2-мерный массив независимо?
Спасибо