我需要計算每列切片變化的2D numpy陣列的平均值。意思是在不同切片的2D numpy陣列
例如,我已陣列
arr = np.arange(20).reshape(4, 5)
與切片爲每列的結束索引平均定義爲
bot_ix = np.array([3, 2, 2, 1, 2])
第一列的平均然後將
arr[0:bot_ix[0], 0].mean()
什麼是合適的(即Pythonic +高效)的方式來做到這一點?我的數組大小是〜(50,50K)。
我需要計算每列切片變化的2D numpy陣列的平均值。意思是在不同切片的2D numpy陣列
例如,我已陣列
arr = np.arange(20).reshape(4, 5)
與切片爲每列的結束索引平均定義爲
bot_ix = np.array([3, 2, 2, 1, 2])
第一列的平均然後將
arr[0:bot_ix[0], 0].mean()
什麼是合適的(即Pythonic +高效)的方式來做到這一點?我的數組大小是〜(50,50K)。
你可以使用NumPy broadcasting
-
mask = bot_ix > np.arange(arr.shape[0])[:,None]
out = np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
採樣運行來驗證結果 -
In [431]: arr
Out[431]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [432]: bot_ix
Out[432]: array([3, 2, 2, 1, 2])
In [433]: np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
Out[433]: array([ 5. , 3.5, 4.5, 3. , 6.5])
In [434]: [arr[0:item, i].mean() for i,item in enumerate(bot_ix)]
Out[434]: [5.0, 3.5, 4.5, 3.0, 6.5] # Loopy version to test out o/p
通過用'bot_ix'代替'mask.sum(0)',你甚至可以更優化一步。但迄今爲止最好的解決方案! +1 –
@OliverW。當然啊!我錯過了,謝謝! OP應該記下它。 – Divakar
一種方式做到這一點,是讓numpy的計算累計總和,然後用花哨的索引中新生成的陣列,如下所示:
np.true_divide(arr.cumsum(axis=0)[bot_ix-1,range(arr.shape[1])], bot_ix)
我不會做任何假設a回合速度,因爲它不必要地計算超過嚴格要求的更多元素的累積總和,但它完全取決於您的特定數據。
Divakar和Oliver W.
mask = np.arange(arr.shape[0])[:, None] < bot_ix
(arr * mask).sum(0)/bot_ix.astype(float)
array([ 5. , 3.5, 4.5, 3. , 6.5])
的交融,我選擇了最快時間爲答案。比較和後代: Divakar:12.4毫秒 奧利弗:47.5毫秒 piRSquared:18.4毫秒 –