2012-11-05 7 views
2

배열의 분수 부분 만 가져와야합니다. numpy 또는 단순히 python modf 함수를 사용하는 것이 편리합니다. 경우numpy 배열의 분수 부분

우리 긍정적 인 부분 데이터의 큰 배열, 즉 예를 들어 (1000000,3)만큼 큰 수 있습니다, 더 편리 무엇을해야 할 일 : 제 생각에는

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

2 빠르고 저렴 메모리 사용량 ...하지만 확실하지 않습니다. 파이썬과 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를 직접 사용하는 것보다 많은 메모리를 사용하지 않으면 놀랄 것입니다.

[BTW, 코드가 원하는대로 작동하고 개선에만 관심이 있다면 the codereview stackexchange에 관심이있을 수 있습니다. 나는 여전히 나누는 선이 어디에 있는지 잘 이해하지 못한다. 그러나 이것은 차 한잔과 조금 더 비슷하다.]

+0

감사합니다. % 1에 대해 생각하지 않았습니다. 이것이 가장 편리한 해결책이라고 생각합니다. 순수 파이썬을 사용하기 때문에 안부 – Cobry

+0

"전문가"가 속도를 확인하기 위해'timeit '을 사용하기를 바랍니다. 고무가 도로를 만나는 곳에서는 실제로 측정 할 때까지 무언가가 어떻게 수행 될지 알려주지 않습니다. – mgilson

+0

% = 1을 사용하면 조금 더 나은 성능을 얻을 수 있습니다. 값을 저장하기 위해 새 배열을 사용하는 대신 배열에서 배열을 수정합니다. – EnricoGiampieri

관련 문제