цикл для итерации по столбцам массива numpy (с размерностью либо 1D, либо 2D)

#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. Я обновил ответ, чтобы показать, как передавать дополнительные параметры