2012-11-05 44 views
2

我只需要得到數組的小數部分。 使用numpy或者簡單的python modf函數很方便。numpy數組的小數部分

在情況下,我們積極的分數大數據陣列,即可以像(1000000,3)大的情況下,什麼是更方便的事:

numpy.modf(array)[0] 
array-numpy.trunc(array) 

在我看來2是更快,更便宜在內存使用...但不確定。 Python和numpy專家認爲什麼?

回答

3

我不是專家,所以我必須使用timeit模塊來檢查速度。我使用IPython(它使得時序事情變得非常簡單),但即使沒有它,timeit模塊也可能是一條可行的路。

In [21]: a = numpy.random.random((10**6, 3)) 

In [22]: timeit numpy.modf(a)[0] 
10 loops, best of 3: 90.1 ms per loop 

In [23]: timeit a-numpy.trunc(a) 
10 loops, best of 3: 135 ms per loop 

In [24]: timeit numpy.mod(a, 1.0) 
10 loops, best of 3: 68.3 ms per loop 

In [25]: timeit a % 1.0 
10 loops, best of 3: 68.1 ms per loop 

最後兩個是等價的。我對存儲器的使用瞭解不多,但是如果modf(a)[0]a-numpy.trunc(a)都沒有使用更多內存,而是直接使用mod,我會感到驚訝。 [如果你的代碼做了你想做的事,而你只對改進感興趣,你可能會對the codereview stackexchange感興趣。我仍然沒有很好的處理分界線的位置,但是這種感覺更像是一杯茶。]

+0

謝謝我沒有想過%1,這是我認爲最方便的解決方案因爲它使用純粹的python 問候 – Cobry

+0

我應該希望「專家」也使用'timeit'來檢查速度。在橡膠遇到道路的地方,(通常)不知道如何進行測量,直到您真正測量爲止。 – mgilson

+0

如果使用%= 1,則可以獲得稍微更好的性能。而不是使用新的數組來存儲值,因爲它修改了數組 – EnricoGiampieri