2012-11-05 42 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