2014-05-16 2 views
6

이 질문은 이전에 요청되었지만 솔루션은 1D/2D 배열에서만 작동하며 좀 더 일반적인 대답이 필요합니다.python - 데이터를 복제하지 않고 numpy 배열 반복하기

데이터를 복제하지 않고 어떻게 반복 배열을 만드나요? 메모리 사용량없이 파이썬 연산을 벡터화하는 데 도움이되므로 일반적으로 사용되는 것으로 생각됩니다.

더 구체적으로 말해서, (y, x) 배열을 만들려면 여러 번 타일링해야합니다. numpy.tile (array, (nz, 1,1))을 사용하여이 작업을 수행 할 수 있지만 메모리가 부족합니다. 내 구체적인 사례는 x = 1500, y = 2000, z = 700입니다.

+1

더 큰 배열로 무엇을 할 것입니까? 'array [None, :, :]]'는 타일 배열과 마찬가지로 유용 할 수 있습니다. y 또는 x 차원에서 '점'제품을 사용하지 않으면 메모리 오류가 발생할 수 있습니다. – hpaulj

+0

지구 물리학 데이터 세트에 지리적 마스크를 (시간, y, x) 형태로 적용해야합니다. 내가 사용하고있는 모듈은 마스크가 데이터 집합과 동일한 모양이어야하므로 시간 차원에 (y, x) 마스크를 복제해야합니다. – user3644731

답변

4

하나의 간단한 트릭은 첫 번째 차원에서 z -long 벡터에 대한 귀하의 (x, y)을 방송 np.broadcast_arrays을 사용하는 것입니다

import numpy as np 

M = np.arange(1500*2000).reshape(1500, 2000) 
z = np.zeros(700) 

# broadcasting over the first dimension 
_, M_broadcast = np.broadcast_arrays(z[:, None, None], M[None, ...]) 

print M_broadcast.shape, M_broadcast.flags.owndata 
# (700, 1500, 2000), False 

this answer의 1 차원 배열에 주어진 stride_tricks 방법을 일반화하기 위해, 당신은 단지 필요 출력 배열의 각 차원에 대한 모양과 보폭을 포함하십시오.

M_strided = np.lib.stride_tricks.as_strided(
       M,        # input array 
       (700, M.shape[0], M.shape[1]), # output dimensions 
       (0, M.strides[0], M.strides[1]) # stride length in bytes 
      ) 
+0

방송은 내가 원했던 것과 정확히 일치합니다. 그것은 stride_tricks 메소드보다 더 간단하고 논리적 인 것으로 보인다. – user3644731

+0

내부적으로'broadcast_arrays'는 정확하게이 방식으로'as_strided'를 사용합니다. 'numpy/lib/stride_tricks.py'를보십시오. 트릭을 수행하는 첫 번째 차원의 '0'보폭입니다. – hpaulj

+0

'stride_tricks'를 직접 사용하는 것이 좋겠지 만'stride length in bytes' 행은'(0, M.stride [0], M.strides [1])' – hpaulj