2017-08-31 80 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)獲得平均等效。