Условное снижение - PullRequest
       17

Условное снижение

0 голосов
/ 26 марта 2019

Я хотел бы уменьшить переменное число элементов (или срезов) массива в несколько раз и поместить результат в новый массив. Вроде как в маске np.apply_along_axis, но мы остаемся в numpy

Например, чтобы уменьшить в среднем:

to_reduce = np.array([
    [0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1],
    [1, 0, 1, 0, 1],
    [1, 1, 1, 1, 0]]).astype(np.bool8)
arr = np.array([
    [1.0, 2.0, 3.0],
    [1.0, 2.0, 4.0],
    [2.0, 2.0, 3.0],
    [2.0, 2.0, 4.0],
    [1.0, 0.0, 3.0]])

Я хочу:

np.array([
    [1.5, 2.0, 3.5],
    [1.5, 1.0, 3.5],
    [1.33333, 1.33333, 3.0],
    [1.5, 2.0, 3.5]])

Медленный путь будет:

out = np.empty((4, 3))
for j, mask in enumerate(to_reduce):
    out[j] = np.mean(arr[mask], axis=0)

1 Ответ

2 голосов
/ 26 марта 2019

Вот один простой и эффективный способ с matrix-multiplication -

In [56]: to_reduce.dot(arr)/to_reduce.sum(1)[:,None]
Out[56]: 
array([[1.5       , 2.        , 3.5       ],
       [1.5       , 1.        , 3.5       ],
       [1.33333333, 1.33333333, 3.        ],
       [1.5       , 2.        , 3.5       ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...