가능한 많은 수의 배열에서 다른 작은 배열로 슬라이스를 복사해야 할 필요가 있습니다. 궁극적으로 작은 배열은 처리를 위해 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
나는 항상 이것에 대해 궁금해했습니다. 따라서,'aa'가 배열로 초기화되면,'aa [:] = ...'는 기존의 배열에 데이터를 복사합니까? 우리가'aa = a [...]'라고 쓰면,'aa'를'a [...]'로 덮어 씁니다. –
일종. '[:]'을 추가하면 rhs를 배열에 복사하려고 시도하는 ndarray의'__setitem__' 메쏘드에 대한 호출을 트리거합니다. 그렇지 않으면, 일반적인 파이썬 의미론이 작동하고, lhs에 레이블을 지정하여 rhs의 객체를 가리 킵니다. lhs 레이블이 다른 것을 가리키면 더 이상 표시되지 않으므로 가비지 수집됩니다. – Jaime