私はM×N個の配列を持っています。 FFTの前に、MとNの最初のインデックスが元のデータであり、各次元に沿ったKの最後のインデックスがゼロである(M + K)×(N + K)の配列を得るために0を埋め込む必要があります。Cython:配列のメモリ効率的な埋め込み
Cythonを使用すると、np.ndarray[DTYPE_t, ndim=2]
タイプを失うことなく効率的な方法がありますか?
私はM×N個の配列を持っています。 FFTの前に、MとNの最初のインデックスが元のデータであり、各次元に沿ったKの最後のインデックスがゼロである(M + K)×(N + K)の配列を得るために0を埋め込む必要があります。Cython:配列のメモリ効率的な埋め込み
Cythonを使用すると、np.ndarray[DTYPE_t, ndim=2]
タイプを失うことなく効率的な方法がありますか?
一つの方法は、正しいサイズのターゲットを作成することで、値をコピーします。
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と入力されていると、コピーは高速になるかもしれませんが、テストする必要があります。
それは私がやったことです。ありがとう! Cythonはその目的では使用されていませんが、私はこの機能をCythonモジュールの中に必要としています。 –
以下はその型を変更することなく、パッド入りのバージョンにあなたの配列を向けるだろう:配列をパディングの
array = np.hstack((array,np.zeros((np.size(array,0),K))))
array = np.vstack((array,np.zeros((K,np.size(array,1)))))
私は最もメモリ効率が良いと思う 'ndarray.resize'を使用して、配列内のデータを正しい場所に移動することです。 – user7138814