Объяснение unutbu хорошо, но я не согласен с возвращаемым измерением.
Внутренний шаблон функции зависит от типа функции.
Операции сокращения с аргументом оси часто можно записать так, чтобы количество измерений не имело значения.
Numpy также имеет функцию atleast_2d (и atleast_1d), которая также обычно используется, если вынужен явный 2d массив.В статистике я иногда использую функцию, подобную atleast_2d_cols, которая преобразует 1d (r,) в 2d (r, 1) для кода, который ожидает 2d, или если входной массив равен 1d, то для интерпретации и линейной алгебры требуется вектор столбца.(изменение формы дёшево, так что это не проблема)
В третьем случае у меня могут быть разные пути кода, если нижний размерный случай может быть сделан дешевле или проще, чем более высокий размерный случай.(пример: если для 2d требуется несколько точечных произведений.)
возвращаемое измерение
Я думаю, что несоблюдение соглашения о пустяках с возвращаемым измерением может очень запутать пользователей для общих функций.(Тематические функции могут быть разными.) Например, операции сокращения уменьшают одно измерение.
Для многих других функций выходное измерение соответствует входному измерению.Я думаю, что 1d вход должен иметь 1d выход, а не лишнее измерение.За исключением функций в linalg, я не помню функций, которые бы возвращали избыточное дополнительное измерение.(Случай скалярного и одноэлементного массива не всегда согласован.)
Стилистически это напоминает мне проверку isinstance:
Попробуйте без него, если вы разрешите, например, для пустых матриц и замаскированных массивов,Вы получите забавные результаты, которые нелегко отладить.Хотя для большинства функций numpy и scipy пользователь должен знать, будет ли с ними работать тип массива, поскольку существует мало проверок экземпляров, и asarray может не всегда делать правильные вещи.
Как пользователь, я всегдазнаю, какой у меня массив, как список, кортеж или какой подкласс массива, особенно когда я использую умножение.
np.array(np.eye(3).tolist()*3)
np.matrix(range(3)) * np.eye(3)
np.arange(3) * np.eye(3)
другой пример: что это делает?
>>> x = np.array(tuple(range(3)), [('',int)]*3)
>>> x
array((0, 1, 2),
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
>>> x * np.eye(3)