Распаковать массив NumPy по столбцу

Если у меня есть массив NumPy, например 5x3, есть способ распаковать его по столбцу все сразу, чтобы перейти к функции, а не как это: my_func(arr[:, 0], arr[:, 1], arr[:, 2])?

Вид типа *args для распаковки списка, но по столбцу.

Ответ 1

Вы можете распаковать транспонирование массива, чтобы использовать столбцы для аргументов функции:

my_func(*arr.T)

Вот простой пример:

>>> x = np.arange(15).reshape(5, 3)
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

Давайте напишем функцию для добавления столбцов вместе (обычно это делается с помощью x.sum(axis=1) в NumPy):

def add_cols(a, b, c):
    return a+b+c

Тогда имеем:

>>> add_cols(*x.T)
array([15, 18, 21, 24, 27])

Массивы NumPy будут распакованы по первому размеру, поэтому необходимо транспонировать массив.

Ответ 2

numpy.split разбивает массив на несколько подмассивов. В вашем случае indices_or_sections равен 3, поскольку у вас есть 3 столбца, а axis = 1 поскольку мы разбиваем по столбцам.

my_func(numpy.split(array, 3, 1))

Ответ 3

Я думаю, что numpy.split не будет достаточно в будущем. Вместо этого он должен быть

my_func(tuple(numpy.split(array, 3, 1)))

В настоящее время python выводит следующее предупреждение:

FutureWarning: Использование последовательности без кортежей для многомерного индексация не рекомендуется; используйте arr[tuple(seq)] вместо arr[seq]. В будущем это будет интерпретироваться как индекс массива, arr[np.array(seq)], что приведет либо к ошибке, либо к другой результат.