2017-12-15 21 views
0

나는 M × N의 numpy 배열을 가지고있다. FFT 전에 M과 N의 첫 번째 인덱스가 원래 데이터이고 각 차원의 K 개의 마지막 인덱스가 0 인 (M + K) × (N + K) 배열을 얻으려면 0으로 채워야합니다.Cython : 배열의 메모리 효율적인 패딩

Cython을 사용하면 np.ndarray[DTYPE_t, ndim=2] 유형을 잃지 않고 효율적인 방법이 있습니까? 다음은 그 형태 변경하지 않고 패드 버전으로 배열을 설정합니다

+0

가장 효율적인 메모리 효율은'ndarray.resize'를 사용하고 배열 내의 데이터를 올바른 위치로 이동시키는 것입니다. – user7138814

답변

1

한 가지 방법은 적당한 크기의 대상을 만드는 것입니다, 그리고 값 복사 :

In [137]: M,N,K = 10,20,5 
In [138]: source = np.arange(M*N).reshape(M,N) 
In [139]: target = np.zeros((M+K, N+K), dtype=source.dtype) 
In [140]: target[:M, :N] = source 

더 이상 메모리를 확보 할 수 없습니다.

메모리 사용은 대처 방법이 아닌 소스 및 대상 배열의 크기에 의해 결정되므로 메모리 사용에 도움이되는 방법은 없습니다.

더욱 빠르고, 특히 target을 해석 된 Python에서 사용할 수있는 배열로 만들고 싶지 않은 경우에도 확실하지 않습니다. 소스와 타겟이 모두 memoryview라고 입력되면 복사 속도가 빨라지지만 테스트해야합니다.

+0

그게 내가 끝내 준거야. 감사 ! Cython은 그 목적으로 사용되지 않지만 Cython 모듈 안에이 기능이 필요합니다. –

0

: 배열을 패딩의

array = np.hstack((array,np.zeros((np.size(array,0),K)))) 
array = np.vstack((array,np.zeros((K,np.size(array,1)))))