2014-09-05 5 views
2

가능한 많은 수의 배열에서 다른 작은 배열로 슬라이스를 복사해야 할 필요가 있습니다. 궁극적으로 작은 배열은 처리를 위해 2 차원 배열로 C 함수로 전달됩니다. 이 때문에 서브 어레이 데이터는 연속적인 메모리 블록 내에서 복사되어야합니다.대용량 열 배열의 조각을 작은 연속 메모리 배열로 효율적으로 복사

아래의 예에서는 더 작은 배열 (aa)을 효율적으로 할당하려고 시도하지만 각 반복에서 복사하기 전에 새로 만든 배열이 생성됩니다.

import numpy as np 

M=1024 
N=8 
a = np.zeros((2,M),dtype=np.float32,order='C') 
aa = np.zeros((2,N),dtype=np.float32,order='C') 
for n in xrange(M/N): 
    aa = a[:,n*N:n*N+N] 
    #pass array to c function - e.g. foo(aa,aa.shape[0],aa.shape[1]) 
    print aa 
    a[:,n*N:n*N+N] = aa 

답변

2

당신은 a의 데이터가 아니라 각 반복에서 만든 새를 가진보다는 기존 aa 배열에 복사되도록 aa[:] = a[:, n*N:n*N+N]을하고 싶은, 다른 하나는 버려. 하위 어레이가 슬라이스로 추출되기 때문에

편집, 영업 이익의 사건에 대해 두 번 생각, aa 각 반복에서 새로운 배열,하지만 배열 a에 새 뷰되지 않습니다. 따라서 연속적이지 않을 것입니다. 이는 성능보다 더 큰 우려 일 것입니다. 원래 할당 된 aa 배열은 첫 번째 반복에서 사용되지 않은 가비지 수집됩니다.

+0

나는 항상 이것에 대해 궁금해했습니다. 따라서,'aa'가 배열로 초기화되면,'aa [:] = ...'는 기존의 배열에 데이터를 복사합니까? 우리가'aa = a [...]'라고 쓰면,'aa'를'a [...]'로 덮어 씁니다. –

+1

일종. '[:]'을 추가하면 rhs를 배열에 복사하려고 시도하는 ndarray의'__setitem__' 메쏘드에 대한 호출을 트리거합니다. 그렇지 않으면, 일반적인 파이썬 의미론이 작동하고, lhs에 레이블을 지정하여 rhs의 객체를 가리 킵니다. lhs 레이블이 다른 것을 가리키면 더 이상 표시되지 않으므로 가비지 수집됩니다. – Jaime

관련 문제