2014-01-16 2 views
2

래스터 크기가 1 백만 * 1 백만인 2 차원짜리 배열 (raster_data)이 있습니다. 다음과 같이 내가 두 개의 클래스로 그 래스터를 분류 할 : 나는 메모리 오류가있는 데이터의 매우 큰 크기로 인해 그러나NumPy 코드 가속화

class_A = np.where((raster_data >= 5.23) & (raster_data < 8.55),raster_data,np.nan) 
class_B = np.where((raster_data >= 8.55) & (raster_data < 10.0),raster_data,np.nan) 

. 원하는 래스터를 어떻게 분류 할 수 있습니까? 나는 16GB RAM과 64bit NumPy로 이미 시도했다.

+1

문제가 메모리 일 때 제목 속도는 왜입니까? – cyborg

+2

1e6 x 1e6 항목의 배열에는 1 조 (1e12) 개의 항목이 있습니다. 하나의 항목 당 하나의 비트를 저장했다 할지라도, 단순히 'raster_data' 배열을 저장하기 위해 125 GB가 필요합니다 ** 단 정밀도 부동 소수점을 사용하면 4 TB의 메모리가 필요합니다 ... – Jaime

+0

대답은 당신이 가고있는 것에 달려 있습니다 클래스와 관련된 작업, 클래스에있는 요소 수 (희소 행렬) 및 데이터 저장 방법에 대해 설명합니다. – cyborg

답변

3
당신은 메모리를 절약하기 위해 부울 인덱싱 및 현재 위치에서 작업을 시도 할 수 있습니다

: 당신은, 디스크 스토리지에 어떤 형태가 필요합니다 데이터 집합은 참으로 지정한만큼 굉장히 큰 경우

>>> class_A = raster_data.copy() 
>>> class_B = raster_data.copy() 
>>> mask = raster_data < 5.23 
>>> mask |= raster_data >= 8.55 
>>> class_A[mask] = np.nan 
>>> mask = raster_data < 8.55 
>>> mask |= raster_data >= 10 
>>> class_B[mask] = np.nan 
+0

아니요, 여기서 '마스크'는 OP의 질문에서 조건의 부정입니다. 그는 'raster_data'값을 어디에 둘 것인지 선택하고 있는데, np.nan으로 값을 repalce 할 위치를 찾고 있습니다. '~ (a & b) == ~ a | 이후 두 조건을'&'- 대신에'| ' ~ b'. – Jaime

0

및 OUT- 코어 계산.

모든 것은 정확히 그 마스크로 무엇을하고 싶은가에 달려 있지만, pytables를 살펴보십시오. 그러한 대형 어레이의 효율적인 저장 및 조작이 가능합니다.

3

이것은 pytables로 할 수있는 방법입니다. 나는 네가 참을성이 있고 많은 공간을 가지길 희망한다.

import tables as tb 
import numpy as np 
import time 

f = tb.openFile('humongusFile.h5', 'w') 

n = 100000 
x = f.createCArray(f.root, 'x', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 



t0 = time.time() 

for i in range(n): 
    x[i] = np.random.random_sample(n)* 10 
x.flush() # dump data to disk 

t1 = time.time() 
print t1 - t0 
print "Done creating test data" 

y1 = f.createCArray(f.root, 'y1', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 
y2 = f.createCArray(f.root, 'y2', tb.Float16Atom(), (n,n), filters=tb.Filters(5, 'blosc')) 

t2 = time.time() 
print t2 - t1 
print "Done creating output array" 

expr = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)") 
expr.setOutput(y1) 

expr2 = tb.Expr("where((x >= 5.23) & (x < 8.55), x, 0)") 
expr2.setOutput(y2) 

t3 = time.time() 
print t3 - t2 
print "Starting evaluating first output" 
expr.eval() 
print "Starting evaluating second output" 
expr2.eval() 
print "Done" 
t4 = time.time() 
print t4 - t3 
+0

PyTables를 사용한 구현은 정말 훌륭하지만, 표현식에서 0 대신에 np.nan 값을 사용할 수있는 것은 아닙니다. –

+0

@rockpy PyTables가 nan 값을 지원하는지 잘 모르겠습니다. 그러나 당신은 종종 nan으로 데이터에 나타나지 않아야하는 값을 "정의"할 수 있습니다. – M4rtini