2014-04-28 2 views
2

데이터 관측치 (수레)가 3 차원으로 큰 배열을 생성하는 코드를 작성했습니다. 크기는 (33,000 x 2016 x 53)이며 (# obs.locations x 5min_intervals_perweek x weeks_in_leapyear)에 해당합니다. 매우 희박합니다 (항목의 약 1.5 %가 채워짐).Large Sparse Numpy Array를 절약 (평균)

현재 나는 호출하여이 작업을 수행합니다

my3Darray = np.zeros(33000,2016,53) 

또는

my3Darray = np.empty(33000,2016,53) 

내 루프 후 시간과 수레와 업데이트 1.5 %를에 배열 한 항목에 인덱스 (이 부분은 실제로 매우입니다 빠른). 그때 필요에 :

  1. 저장 각 차원 (X 2016 33000)를 CSV 또는 다른 '일반 형식의 데이터 파일
  2. 그래서 나는 33000 X 2016 얻어야한다 (3 차원에 걸쳐 평균을 가지고 같은 조각 매트릭스)

내가 함께 저장 시도 :

for slice_2d_week_i in xrange(nweeks): 
    weekfile = str(slice_2d_week_i) 
    np.savetxt(weekfile, my3Darray[:,:,slice_2d_week_i], delimiter=",") 

그러나,이 매우 느리고 출력에 빈 항목이

,536,913,632로 표시 10
0.000000000000000000e+00 

파일 크기가 커집니다.

더 효율적인 방법으로 저장할 수 있습니까 (결코 업데이트되지 않은 항목에 공백이 남을 수 있습니까?) np.zeros 또는 np.empty 외에도 배열을 할당하는 더 좋은 방법이 있습니까? 그리고 업데이트되지 않은 항목 (mean (my3Darray, 3)이 0 항목을 무시하지 않음)을 무시하면서 3 차원에서 평균을 취하는 방법은 무엇입니까?

+1

다음은'scipy.sparse' 형식 중 하나를 사용하는 것이 좋습니다. –

답변

0

numpy의 이진 형식 중 하나를 저장할 수 있습니다. 사용하는 형식은 np.savez입니다.

np.sum(a, axis=2)/np.sum(a != 0, axis=2)으로 평균을 낼 수 있습니다. 분모에 0이있는 경우에도 여전히 NaN이됩니다.

+0

고맙습니다. - np.saves를 살펴 보겠습니다. 나는 a! = 0 논리 색인 방법을 시도했지만,이 논리 배열을이 크기의 배열에 대해 실행하는 것이 실제로 느린 (몇 분) 것으로 나타났습니다. – cataclysmic

+0

scipy.sparse 배열을 대신 사용해보십시오. – U2EF1

+0

내가 알 수있는 한, scipy.sparse는 다차원 적이 아니다. 나는 단지 하나의 (33000 x 2016 x 53) 3D 배열보다는 53 개의 2D 배열을 만들 수 있습니다. 그렇지만 나는 여전히 53 가지 어레이를 평평하게해야한다. – cataclysmic