2017-12-15 38 views
0

私はM×N個の配列を持っています。 FFTの前に、MとNの最初のインデックスが元のデータであり、各次元に沿ったKの最後のインデックスがゼロである(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 

これ以上メモリを使用することはできません。

メモリの使用は、コーディング方法ではなく、ソース配列とターゲット配列のサイズによって決まるため、cythonがどのようにメモリ使用に役立つか分かりません。

特に、targetをインタープリターされたPythonで使用できるnumpy配列にしたい場合は、それがより高速になるかどうかはわかりません。ソースとターゲットの両方が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)))))