2013-06-07 3 views
0

[편집]float32 numpy 배열을 사용하여 mean과 std를 계산하려고합니다. float64가 반환되었습니다.

제 테스트 사례가 제대로 검토되지 않았습니다. 나는 1-D 어레이에서만 테스트했다. 어떤 경우에는 64 비트 스칼라가 반환됩니다. 3D 배열로 만들면 예상대로 32 비트를 얻습니다.

엄청난 수의 배열 (600 * 600 * 4044)의 평균 및 표준 편차를 계산하려고하며 메모리 한계 (64 비트 시스템의 경우 16GB)에 가깝습니다. 그래서 나는 기본값 인 float64보다는 모든 것을 float32로 처리하려고합니다. 그러나 dtype을 float32로 지정해도 데이터에 대한 작업을 시도 할 때마다 float64가 반환됩니다. 왜 이런 일이 일어 났습니까? 그래, 나중에 변환 할 수 있지만 내가 말한 것처럼 나는 내 RAM의 한계에 가깝다. 나는 처리 단계에서도 가능한 한 모든 것을 작게 유지하려고 노력하고있다. 아래는 내가 얻는 예입니다.

import scipy 
a = scipy.ones((600,600,4044), dtype=scipy.float32) 
print(a.dtype) 

a_mean = scipy.mean(a, 2, dtype=scipy.float32) 
a_std = scipy.std(a, 2, dtype=scipy.float32) 

print(a_mean.dtype) 
print(a_std.dtype) 

반환

float32 
float32 
float32 
+0

이 너무 쉽게 그냥 64 비트 파이썬 –

+0

이유로 전환 할 수 있을까요? 그게 어떻게 도움이 될지 모르겠다. – Caustic

+1

그러면 32 비트 주소 공간으로 제한되지 않을 것입니다. 그것이 실제 RAM이 아니라 실제 한계라고 기대되는 것입니다. –

답변

1

: 원래의 질문 당신은 64 비트 파이썬으로 전환해야

에 적용이 답변. 귀하의 의견에 따르면 개체의 크기는 32 비트 부동 소수점이있는 5.7GB입니다. 기껏해야 4GB의 32 비트 주소 공간에는 맞지 않습니다.

64 비트 파이썬으로 전환하면 64 비트 부동 소수점을 사용하여 중간 값에 대해 걱정할 필요가 없어 질 것입니다. 실제로 64 비트 부동 소수점을 사용하여 전체 계산을 수행 할 수 있습니다.

이미 64 비트 파이썬을 사용하고있는 경우 (귀하의 의견이 나를 혼란스럽게합니다.) scipy.mean 또는 scipy.std이 64 비트 부동 소수점을 반환하는 것에 대해 걱정할 필요가 없습니다. 그것은 배열의 15 억 개 값 중 하나의 단일 값입니다. 걱정할 필요가 없습니다.

: 이 답변은 새로운 질문

질문의 코드를 실행 한 결과는 다음과 생산에 적용 즉

 
float32 
float32 
float32 

을, 당신이보고 증상에없는 현실을 대표하는 사실. 혼란 스러울 이유는 이전에 작성한 코드를 사용하여 원래의 대답이 적용된 코드가 매우 다르고 일차원 배열로 작동한다는 것입니다. 그것은 마치 scipy이 스칼라를 float64으로 반환하는 것처럼 보입니다. 그러나 반환 값이 스칼라가 아닌 경우 데이터 유형은 생각대로 변형되지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 당신이 내 문제를 이해한다고 생각하지 않아요. 나는 64 비트 파이썬을 사용하고있다. 배열을 32 비트 주소 공간에 맞추려고하지 않습니다. 나는 단지 내가 가진 기억을 보존하려고 노력하고있다. 11.5Gb는 너무 커서, 지금은 처리 할 공간이 없기 때문에가 아닙니다. 하지만 여전히로드하고 싶은 물건이 더 많기 때문에. 또한 OS를 차지하는 공간의 메모리가 있습니다. – Caustic

+0

흠, OP는 32 비트 부동 소수점을 기본 값으로 원하지만 어레이 자체는 64 비트 포인터로 주소 지정 될 수 있습니다. – lucasg

+0

위의 귀하의 의견은 "왜 도움이 될지 모르겠습니다." 32 비트 파이썬을 사용하고 있었다. 이 중간 값은 문제가되지 않습니다. –

0
당신은 기본 유형 변경을 강제 할 수

:

a_mean = numpy.ndarray(scipy.mean(a, dtype=scipy.float32) , dtype = scipy.float32) 

나는 그것을 테스트 한을, 내가 틀렸다면 정정 해줘 주시기 바랍니다.out 옵션

있습니다 : http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html

a = scipy.ones(10, dtype=scipy.float32) 
b = numpy.array(0,dtype=scipy.float32) 

scipy.mean(a, dtype=scipy.float32, out=b) 

테스트 :

In [34]: b= numpy.array(0) 

In [35]: b= numpy.array(0,dtype = scipy.float32) 

In [36]: b.dtype 
Out[36]: dtype('float32') 

In [37]: scipy.mean(a, dtype=scipy.float32, out = numpy.array(b))              
Out[37]: 1.0 

In [38]: b 
Out[38]: array(0.0, dtype=float32) 

In [39]: 
+0

"Yes can I can convert"라는 질문에서 Caastic이이를 수행하는 방법을 알고 있다고 생각합니다. –

+0

다른 방법을 찾았습니다 – lucasg

+0

아직 테스트하지 않았습니다. 나는 이것이 여전히 매우 큰 어레이 (11.5GB)를 만들고 그것을 변환 할 것이라고 생각한다. 그래서 실행의 어떤 시점에서 그것은 내 기억을 최대화 할 것입니다. 그래서 나는 변환을 피하고 numpy가 32 비트를 기본적으로 사용하도록하고 싶습니다. – Caustic

관련 문제