#python #numpy #numpy-ndarray
#python #numpy #numpy-ndarray
Вопрос:
Я пытаюсь написать функцию, которая получает массив numpy, ввод и передает его столбцы один за другим в другую функцию. входной массив равен либо 1D, либо 2D (не более), вторая функция ожидает, что 1D массивы в качестве параметра. (len(param.shape)==1)
Я прочитал похожий поток, где OP хотел просуммировать все столбцы и проверить наличие других условий… это, вероятно, требует другого ответа.
желаемая операция в псевдокоде:
def func(INPUT,a,b,...)
for column in INPUT: #whether be a 1D or 2D
result = another_func(column,...)
пробовали это:
вопрос в том, как не проверять размерность входного массива внутри функции:
if(len(INPUT.shape)==1):
another_func(INPUT,....)
elif(len(INPUT.shape)==2):
for c in range(INPUT.shape[1]):
another_func(INPUT[:,c])
Комментарии:
1.
for column in INPUT.T: ...
может сработать для вас. Транспонирование ничего не делает в случае 1d; в 2d сначала ставится размер столбца. В качестве альтернативыfor j in range(INPUT.shape[-1]): column=INPUT[...,J],..
выполнить итерацию по последнему индексу.2. В вашем
INPUT.ndim==2
случаеenumerat(INPUT)
выполняется итерация по строкам, гдеc
указывается количество строк, а не количество столбцов. Итерация по массиву повторяется по первому измерению, точно так же, как это было бы для вложенного списка списков.3. извините, это была опечатка, я скопировал код и отредактировал его здесь, отредактировал его в range(), как в моем пробованном коде
4. Итак, если это 1d, используйте его без итерации? В этом случае ваша функция выглядит нормально. Нет ничего плохого в проверке размеров;
numpy
функции делают это постоянно. Посмотрите на такие функции, какnp.atleast_2d
. Вы могли бы заставить 1d быть 1 строкой 2d, а затем выполнить цикл!
Ответ №1:
Идея такова: в случае ввода 1d преобразуйте в 2d-массив с 1 столбцом, затем обрабатывайте как 2d-ввод.
def func(INPUT, a, b):
return np.apply_along_axis(
lambda col: another_func(col, a, b), # function to apply
1, # axis along which to apply; 1 = columns
np.reshape(np.atleast_2d(H2), (len(H), -1)) # transform 1D->2D, if necessary
)
Комментарии:
1. это применяет another_func ко всем элементам столбцов, верно? если это так, это мне не поможет, потому что another_func ожидает дополнительных параметров. (Я попытался показать это с помощью … в результате = часть another_func(столбец,…)). но на самом деле спасибо за ответы
2. Я обновил ответ, чтобы показать, как передавать дополнительные параметры