有条件减少

时间:2019-03-26 05:08:35

标签: python numpy vectorization

我想多次减少数组中元素(或切片)的可变数量,并将结果放入新数组中。有点像蒙面的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 个答案:

答案 0 :(得分:2)

这是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       ]])