给定两个数组a
和b
:
import numpy as np
a = np.arange(10, dtype=float)
b = np.arange(0, 10, 2, dtype=float)
我想返回一个与c
形状相同的数组b
,c
中的每个元素都等于a
的平均值,条件是a
小于b
的对应元素。这是一个满口而且更容易表达的:
c = np.array([a[a <= i].mean() for i in b])
但有没有办法避免列表压缩?仅使用b
而不是i
会引发ValueError
,因为这两者无法广播。
注意:正如我现在所做的那样,a
不是(必然)排序的。
答案 0 :(得分:2)
要允许broadcasting
,我们需要为其中一个输入数组添加一个新轴。添加a
,这是一个解决方案 -
mask = (a[:,None] <= b)
c = a.dot(mask)/mask.sum(0)
基本上,a.dot(mask)
为我们提供了总和,我们将它除以有效元素的数量,用mask.sum(0)
找出,以获得相等的平均值。