Если у меня есть массив NumPy, например 5x3, есть способ распаковать его по столбцу все сразу, чтобы перейти к функции, а не как это: my_func(arr[:, 0], arr[:, 1], arr[:, 2])
?
Вид типа *args
для распаковки списка, но по столбцу.
Если у меня есть массив NumPy, например 5x3, есть способ распаковать его по столбцу все сразу, чтобы перейти к функции, а не как это: my_func(arr[:, 0], arr[:, 1], arr[:, 2])
?
Вид типа *args
для распаковки списка, но по столбцу.
Вы можете распаковать транспонирование массива, чтобы использовать столбцы для аргументов функции:
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 будут распакованы по первому размеру, поэтому необходимо транспонировать массив.
numpy.split разбивает массив на несколько подмассивов. В вашем случае indices_or_sections
равен 3, поскольку у вас есть 3 столбца, а axis = 1
поскольку мы разбиваем по столбцам.
my_func(numpy.split(array, 3, 1))
Я думаю, что numpy.split
не будет достаточно в будущем. Вместо этого он должен быть
my_func(tuple(numpy.split(array, 3, 1)))
В настоящее время python выводит следующее предупреждение:
FutureWarning: Использование последовательности без кортежей для многомерного индексация не рекомендуется; используйте
arr[tuple(seq)]
вместоarr[seq]
. В будущем это будет интерпретироваться как индекс массива,arr[np.array(seq)]
, что приведет либо к ошибке, либо к другой результат.