2017-08-31 72 views
1

给定两个阵列ab过滤:广播低于在NumPy的

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

但有什么办法,以避免在此列出comprhension?仅使用b而非i会抛出ValueError,因为两者不能广播。

注意:因为我现在有东西,a不是(必然)排序。

回答

2

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

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

基本上,a.dot(mask)会让我们的总和,我们通过有效的元素数量划分了一下,发现了与mask.sum(0)获得平均等效。