2013-10-22 4 views
5

scipy.random.rand() 및 동일한 패키지의 다른 함수 은 모두 float64 배열을 출력으로 출력합니다. (Mac에서는 Python 2.7.3 64 비트 이상인 경우 64 비트 이상) OS, scipy 버전 0.12.0).floppy32 행렬을 numpy/scipy로 임의 숫자로 초기화합니다.

내가 원하는 것은 float32의 다소 큰 (N 기가 바이트) 랜덤 초기화 매트릭스입니다. float64에 대해 double space 을 할당하고 32 비트로 변환하는 대신에 직접 생성하는 쉬운 방법이 있습니까?

+0

파이썬과 SciPy 버전은 서로 관련이 없습니다. 이 기능은 NumPy에서 제공되며 SciPy에서만 다시 내보낼 수 있습니다. –

+1

FYI : "역사적인 이유"때문에, scipy는 numpy의 대부분을'scipy' 네임 스페이스로 가져옵니다. 'scipy.random'은 실제로'numpy.random'입니다. –

+3

그러나 아니요, 직접적으로'float32'를 얻는 방법이 없을 것 같습니다. 왜냐하면 그 함수들에'dtype' 인자가 없기 때문입니다. 그것은 수치 스럽습니다. –

답변

4

배열에 미리 할당 한 다음 Warren Weckesser가 권장하는대로 float64을 임의로 배치로 복사합니다.

당신은 해킹에 대한의 경우가 여기에 균일 한 랜덤 비트 사용하여 생성 된 열 수레의 : 어떤 좋은 분포를 따르지 않는 물론

>>> bytes_per_float = np.float32(0).nbytes # ugly, I know 
>>> np.frombuffer(random.bytes(10 * bytes_per_float), dtype=np.float32) 
array([ -3.42894422e-23, -3.33389699e-01, -7.63695071e-26, 
     7.02152836e-10, 3.45816648e-18, 2.80226597e-09, 
     -9.34621269e-10, -9.75820352e+08, 2.95705402e+20, 
     2.57654391e+25], dtype=float32) 

, 다음을 NaN의 또는 Inf를을 포함 할 수있는 배열 오류가 발생하여 일부 비 x86 시스템에서 실제로 코드가 충돌 할 수 있습니다.

+2

배포판이 무엇인지 신경 쓰지 않는다면,'np.float64'의 반 길이의 무작위 배열을 만든 다음'.view (np.float32)'it. 그러나 그것은 아마도 적당한 크기의'np.empty' 배열을 직접 생성하는 것보다 낫지 않을 것입니다 ... – Jaime

+2

@Jaime : 아주 큰'np.empty'가 공간을 'mmap'할 수 있다는 것을 제외하고는 ('malloc' 구현), 나는 적어도 하나의 운영체제에 대해 알고있다. 또한, 솔루션은 C 코드에서 정의되지 않은 동작을 유발합니다. –

관련 문제