Есть ли простой способ применить функцию к подмножеству массива numpy? - PullRequest
0 голосов
/ 12 декабря 2018

Предположим, у меня есть следующий массив NumPy

>>> import numpy as np
>>> arr = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [5,6,7,8]]])
>>> arr
array([[[1, 2, 3, 4],
        [5, 6, 7, 8]],
       [[1, 2, 3, 4],
        [5, 6, 7, 8]]])

Я бы хотел отобразить функцию на часть массива, например:

flip_sign = lambda x: x*(-1)

В моем примере яхотел бы применить эту функцию только ко второй строке, получая:

array([[[1, 2, 3, 4],
        [5, 6, 7, 8]],
       [[-1, -2, -3, -4],
        [-5, -6, -7, -8]]])

По сути, я хочу использовать что-то вроде

np.apply_along_axis(flip_sign, 1, arr)

, но указав индекс по оси 0 (илидиапазон индексов), где должна применяться эта функция.

Конечно, я мог бы разбить массив на подмножества, затем применить функцию к подмножеству и снова объединить подмножества.Но есть ли встроенная функция (numpy), которая может легко это сделать?

1 Ответ

0 голосов
/ 12 декабря 2018

Если ваша функция достаточно проста, например, умножение или суммирование по скалярам, ​​вы можете напрямую применить ее к части массива

import numpy as np

arr = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [5,6,7,8]]])
flip_sign = lambda x: x*(-1)
arr[1] = flip_sign( arr[1])

Вывод:

[[[ 1  2  3  4]
  [ 5  6  7  8]]

 [[-1 -2 -3 -4]
  [-5 -6 -7 -8]]]

Это работает, потому чтоспособа перегрузка * + - / реализована в Numpy.Если вы выполните любую из этих операций над массивом со скаляром, он автоматически выполнит операцию над каждым элементом массива.

Для более сложных функций np.apply_along_axes может использоваться следующим образом:

arr[1] = np.apply_along_axis( flip_sign, 0, arr[1])
...