2011-08-05 2 views
4

큰 숫자 배열로 작업하는 데 어려움을 겪고 있습니다. 다음은 시나리오입니다. 나는 300MB - 950MB 이미지로 작업 중이며 GDAL을 사용하여 Numpy 배열로 읽습니다. 배열에서의 읽기는 정확히 예상 한 것만큼의 메모리를 사용합니다. 250MB 이미지의 경우 250MB ...Numpy.mean, amin, amax, std huge returns가

numpy를 사용하여 평균, 최소, 최대 또는 표준 편차를 구할 때 문제가 발생합니다. main()에서 이미지를 열고 배열 (ndarray 유형)을 읽습니다. 그때 나는 2 차원 배열에, 표준 편차를 얻기 위해, 다음과 같은 함수를 호출 :

(A 기가 바이트 기계에) 저는 여기에 지속적으로 메모리 오류를 데
def get_array_std(input_array): 
    array_standard_deviation = numpy.std(input_array, copy=False) 
    return array_standard_deviation 

. documentation에서 numpy는 내 입력과 동일한 모양 및 dtype을 가진 ndarray를 반환하므로 메모리 크기가 두 배로 증가한 것처럼 보입니다.

사용 :

print type(array_standard_deviation) 

결과 :

numpy.float64 

을 추가로 사용 :

print array_standard_deviation 

하나가 기대하는 것처럼 부동 소수점 표준을 돌려줍니다. 이 계산을 수행하려면 다시 numpy가 배열을 읽는 중입니까? 내가 배열을 반복하고 수동으로 계산을 수행하는 것이 더 좋을까요? 평평한 배열로 작업하는 것은 어떻습니까?

큰 배열이 범위를 벗어날 수 있도록 각 통계 호출 (numpy.amin(), numpy.amax(), numpy.std(), numpy.mean())을 자체 함수에 배치 해 보았습니다 , 그러나 거기에서 운 없음. 나는 또 다른 타입으로 돌아 가기를 시도했지만 기쁨은 없다.

답변

4

Numpy는 std에 대해 "단순한"축소 작업을 수행합니다. 꽤 비효율적 인 메모리입니다. 더 나은 구현을 위해 여기를보십시오. http://luispedro.org/software/ncreduce

1

이것이 도움이 될지 모르지만 배열 방법을 사용하여 문제가 해결 되었습니까? 즉

input_array.std() 

대신

numpy.std(input_array) 

당신은 나에게 많은 이해하지 않는 설명하는 문제; 필자는 대용량 배열을 자주 사용하지만 이러한 간단한 작업에서는 오류가 발생하지 않습니다. 참조가 아닌 배열의 복사본을 전달할 수있는 다른 작업이 있습니까?

+0

그냥 input_array.std() 및 운이 변경하려고했습니다. raw_input() 호출을 삽입하고 리소스 모니터를 사용하여 각 호출마다 파이썬 메모리 사용량이 배열 크기만큼 증가했는지 확인할 수 있습니다. input_array를 함수에 전달한 다음 위와 같이 호출합니다. 이 [link] (http://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference)는 변수를 올바르게 전달하고 있음을 나타냅니다. – Jzl5325

+0

정말 이상합니다. 함수 호출을 numpy.std() 함수에 대한 직접 호출로 대체 할 수 있습니까? 아니면 numpy.std()를 get_array_std()로 랩핑해야하는 이유가 있습니까? 네가 그럴만한 이유가 있다고 생각해. 당신이 말한 것에 근거하여 변수를 올바르게 전달하고 있다고 생각합니다. 리소스 소비가 증가 할 때 get_array_std()를 호출하는 문맥은 무엇입니까? 최소한의 스크립트로 테스트 해 보셨습니까? – keflavich

1

당신이 시도하고있는 모든 통계 함수에 문제가 있습니까 아니면 그냥 np.std입니까? 뿐만 -CS 0, 수입 NumPy와 차

  • Q = 랜드 (5600,16000) ipython

    1. 시작 나에게 좋은 큰 시험 배열을 제공 :

      나는이 문제를 재현하는 다음과 같은 방법을 시도했습니다 . np.mean (Q) 동안 외부

    2. 시계 메모리 사용량, np.amin (Q), np.amax (Q), np.std (Q)는 이들의

    , np.std는 상당히 느리다 : 대부분의 기능은 내 컴퓨터에서 0.2 초 걸리고 std는 2.3 초가 걸립니다. 나는 정확한 메모리 누수가 없지만 std를 제외한 모든 것을 실행하는 동안 내 메모리 사용은 거의 일정하게 유지되지만 std를 실행하면 두 배가되고 초기 값으로 되돌아갑니다.내가 요소의 지정된 번호 (내가 100000을 사용하고 있습니다)의 덩어리에서 운영하는 다음과 같은 수정 된 표준을 작성했습니다

    : 이것은 또한에 대해하면서 크게 메모리 사용량을 줄일 것으로 보인다

    def chunked_std(A, chunksize): 
        Aflat = A.ravel() 
        Amean = A.mean() 
        Alen = len(Aflat) 
    
        i = np.concatenate((np.arange(0,Alen,chunksize), [Alen])) 
    
        return np.sqrt(np.sum(np.sum(abs(Aflat[x:y]-Amean)**2) for (x,y) in zip(i[:-1],i[1:]))/Alen) 
    

    나를 위해 정상적인 np.std보다 2 배 빠릅니다. 이러한 함수를 작성하는 데 훨씬 더 우아한 방법이있을 수 있지만 이는 효과가있는 것 같습니다.