我想總結一個數組中的所有值直到給定的百分位數。 例如變量的累計和直到給定的百分位數
import numpy as np
a = [15, 40, 124, 282, 914, 308]
print np.percentile(a,90)
第90百分位〜611和累積總和直到此時才461
是否有Python中的任何功能,能做到嗎?
我想總結一個數組中的所有值直到給定的百分位數。 例如變量的累計和直到給定的百分位數
import numpy as np
a = [15, 40, 124, 282, 914, 308]
print np.percentile(a,90)
第90百分位〜611和累積總和直到此時才461
是否有Python中的任何功能,能做到嗎?
A=np.array(a)
A[:(A<np.percentile(a, 90)).argmin()].sum() #461
@ JoshAdel的
%%timeit
...: b = np.cumsum(a)
...: p90 = np.percentile(a, 90)
...: b[b < p90][-1]
...:
1000 loops, best of 3: 217 µs per loop
此:
%timeit A[:(A<np.percentile(a, 90)).argmin()].sum()
10000 loops, best of 3: 191 µs per loop
沒有,我知道的,但你可以做到這一點
import numpy as np
from itertools import takewhile
a = [15, 40, 124, 282, 914, 308]
p90 = np.percentile(a,90)
print sum(takewhile(lambda x : x < p90, a))
日期:
461
謝謝!有時似乎是一個很酷的功能。 – user308827
import numpy as np
a = np.array([15, 40, 124, 282, 914, 308])
b = np.cumsum(a)
p90 = np.percentile(a, 90)
print b[b < p90][-1] #461
由於cumsum數組按定義排序,因此可以搜索百分比值。 – Jaime
謝謝!特別是有用的意見重新哪種解決方案可能會在哪種情況下更快... – user308827
+1好的解決方案。我會說在我的機器上,對於給定的系統大小,我的代碼更快一些。但是對於更大的陣列,取決於組成,您的代碼可以稍微快一點(5-10%)。 – JoshAdel
我還會在我的機器上添加一個,比任何numpy解決方案,itertools解決方案對於大型隨機數組來說都要稍微快一些。對於小型陣列來說速度會慢一些。再次,這只是在我的機器上,時間必然會有所不同。我將讓OP決定什麼是最適合他們的特定硬件/陣列組合。 – JoshAdel
非常有趣的Josh,我剛發現'itertools'總是比我們的任何一個都快。我在'win32'平臺上有'MKL',我不確定這些操作是否可以使用。一些信息讓誰知道發生了什麼。 –