Написание функций, которые принимают 1-D и 2-D массивы numpy?

Насколько я понимаю, одномерные массивы в numpy можно интерпретировать либо как вектор, ориентированный на столбцы, либо как вектор, ориентированный на строки. Например, одномерный массив с формой (8,) можно рассматривать как двумерный массив формы (1,8) или формы (8,1) в зависимости от контекста.

Проблема, с которой я сталкиваюсь, заключается в том, что функции, которые я пишу для работы с массивами, имеют тенденцию хорошо обобщаться в двумерном случае для работы с векторами и матрицами, но не так хорошо в одномерном случае.

Таким образом, мои функции в итоге делают что-то вроде этого:

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

Это становится еще более уродливым, когда функция работает с несколькими массивами, поскольку я должен проверять и преобразовывать каждый аргумент.

Поэтому мой вопрос: не упустил ли я какую-то лучшую идиому? Является ли шаблон, который я описал выше, общим для кода numpy?

Также, в качестве смежного вопроса о принципах проектирования API, если вызывающая сторона передает одномерный массив некоторой функции, которая возвращает новый массив, а возвращаемое значение также является вектором, является ли обычной практикой преобразование двухмерного вектора (r,1) или (1,c) обратно в одномерный массив или просто документировать, что функция возвращает двухмерный массив независимо от этого?

Спасибо

15
задан Joe Holloway 27 November 2011 в 16:28
поделиться