我是相當新的Python和NumPy的,但好像你可以使用的ufunc
真是讓人不是reduceat
的.at
方法:
import numpy as np
data_id = np.array([0,0,0,1,1,1,1,2,2,2,3,3,3,4,5,5,5])
data_val = np.random.rand(len(data_id))
ans = np.empty(data_id[-1]+1) # might want to use max(data_id) and zeros instead
np.maximum.at(ans,data_id,data_val)
例如:
data_val = array([ 0.65753453, 0.84279716, 0.88189818, 0.18987882, 0.49800668,
0.29656994, 0.39542769, 0.43155428, 0.77982853, 0.44955868,
0.22080219, 0.4807312 , 0.9288989 , 0.10956681, 0.73215416,
0.33184318, 0.10936647])
ans = array([ 0.98969952, 0.84044947, 0.63460516, 0.92042078, 0.75738113,
0.37976055])
當然,這隻有在您的data_id
值適合用作索引時纔有意義(即非負整數,並且不大如果他們很大/稀疏,你可以使用np.unique(data_id)
或其他東西初始化ans
)。
我應該指出data_id
實際上並不需要排序。
感謝@Bago,這給了很好的表現。另一件我覺得有用的事情是,它看起來像lexsort將始終將NaN值放在子窗口的末尾。因此,如果我想查找除NaN之外的每個窗口的最大值,我可以翻轉數據的符號,應用最小公式,然後在出路時再次翻轉該符號,只會有小的性能損失。另一方面,如果我實際上想要在子窗口中的任何位置存在NaN時返回NaN值,那麼我會保持原樣。 – Abiel
Abiel,請參閱np.nanmax - max忽略NaNs – denis
尼斯解決方案。令人煩惱的是,當O(n)時間和O(k)存儲器用於k個bin時,它是O(n log n)時間和O(n)內存。也許numpy應該支持'binmax'和'bincount'。 – joeln