我在Python中使用了很多argmin和argmax。numpy.argmax/argmin更快的替代方法很慢
不幸的是,該功能非常慢。
我做了一些摸索,我可以找到最好的是在這裏:
http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/
def fastest_argmax(array):
array = list(array)
return array.index(max(array))
不幸的是,這個解決方案仍然只有一半快np.max,我想我應該能夠找到和np.max一樣快的東西。
x = np.random.randn(10)
%timeit np.argmax(x)
10000 loops, best of 3: 21.8 us per loop
%timeit fastest_argmax(x)
10000 loops, best of 3: 20.8 us per loop
作爲一個說明,我申請這一個數據幀大熊貓GROUPBY
E.G.
%timeit grp2[ 'ODDS' ].agg([ fastest_argmax ])
100 loops, best of 3: 8.8 ms per loop
%timeit grp2[ 'ODDS' ].agg([ np.argmax ])
100 loops, best of 3: 11.6 ms per loop
當數據是這樣的:
grp2[ 'ODDS' ].head()
Out[60]:
EVENT_ID SELECTION_ID
104601100 4367029 682508 3.05
682509 3.15
682510 3.25
682511 3.35
5319660 682512 2.04
682513 2.08
682514 2.10
682515 2.12
682516 2.14
5510310 682520 4.10
682521 4.40
682522 4.50
682523 4.80
682524 5.30
5559264 682526 5.00
682527 5.30
682528 5.40
682529 5.50
682530 5.60
5585869 682533 1.96
682534 1.97
682535 1.98
682536 2.02
682537 2.04
6064546 682540 3.00
682541 2.74
682542 2.76
682543 2.96
682544 3.05
104601200 4916112 682548 2.64
682549 2.68
682550 2.70
682551 2.72
682552 2.74
5315859 682557 2.90
682558 2.92
682559 3.05
682560 3.10
682561 3.15
5356995 682564 2.42
682565 2.44
682566 2.48
682567 2.50
682568 2.52
5465225 682573 1.85
682574 1.89
682575 1.91
682576 1.93
682577 1.94
5773661 682588 5.00
682589 4.40
682590 4.90
682591 5.10
6013187 682592 5.00
682593 4.20
682594 4.30
682595 4.40
682596 4.60
104606300 2489827 683438 4.00
683439 3.90
683440 3.95
683441 4.30
683442 4.40
3602724 683446 2.16
683447 2.32
Name: ODDS, Length: 65, dtype: float64
我建議查看他們如何做它的numpy源代碼。這裏有一個鏈接:https://github.com/numpy/numpy/blob/1e22553c37e9112bf2426c1b060275419f906d8d/numpy/core/src/multiarray/calculation.c嘗試模仿他們的方法。 – twasbrillig 2014-11-08 11:32:48
「低效率」甚至沒有描述你所謂的「最快的最大值」。 – 2014-11-08 11:49:00
在我的筆記本電腦''timeit np.argmax(x)''x.shape == 10'上只花了1美元,你的numpy版本是什麼? – HYRY 2014-11-08 12:29:05