在NumPy

时间:2017-08-31 15:17:06

标签: python python-3.x numpy

给定两个数组ab

import numpy as np
a = np.arange(10, dtype=float)    
b = np.arange(0, 10, 2, dtype=float)

我想返回一个与c形状相同的数组bc中的每个元素都等于a的平均值,条件是a小于b的对应元素。这是一个满口而且更容易表达的:

c = np.array([a[a <= i].mean() for i in b])

但有没有办法避免列表压缩?仅使用b而不是i会引发ValueError,因为这两者无法广播。

注意:正如我现在所做的那样,a不是(必然)排序的。

1 个答案:

答案 0 :(得分:2)

要允许broadcasting,我们需要为其中一个输入数组添加一个新轴。添加a,这是一个解决方案 -

mask = (a[:,None] <= b)
c = a.dot(mask)/mask.sum(0)

基本上,a.dot(mask)为我们提供了总和,我们将它除以有效元素的数量,用mask.sum(0)找出,以获得相等的平均值。