2017-08-28 2 views
-1

これは重複していると確信していますが、実際には答えが見つからなかったのです。インデックスのリストでメモリビューをスライスする

私の主な問題は、私のコードでnumpyブールインデックスを使用していることです。私はそれを最適化しています。私はそれを毎回reslicing避けるように私は、いくつかの計算のためにそれを使用しているため

y_ind = ~isnan(y) 
otheThing = y[t,y_ind[t,:]] 

私はotherThingでこのスライスを保存する理由は次のとおりです。

私のような何かをします。

私の解決策はとotherThingnp.ndarrayの代わりにメモリビューを使用することでした。

問題は、booleanインデックスがcythonでは機能しないため、整数リストでスライスしようとしていることです。我々はnumpyの中だろうと同じように、のようなもの:私たちはそれをしようとするとどうなります

x = np.random.randn(5,5) 

array([[-0.56313056, -1.27834803, -0.30052179, -2.00063006, -2.05059544], 
     [-0.44563071, -0.63580159, -0.67538499, -0.9192516 , 0.49663121], 
     [ 2.11943794, -0.51746142, -0.80092609, -0.89391932, 1.91359607], 
     [ 0.52593344, -0.59931707, 0.78093441, -1.62449658, -1.65887717], 
     [-0.46422764, 0.96595406, -0.47142008, -0.28886925, -1.86674776]]) 

x[2,[1,2]] 

array([-0.51746142, -0.80092609]) 

のようなものされています

cdef np.ndarray[np.double_t,ndim=2] a = np.random.randn(n,n) 
cdef double[:,:] a_mv = a 
print(np.array(a_mv[5,(1,3)])) 

.pyx:30:27: Invalid index for memoryview specified, type (long, long) 
In [22]: 

それは可能ですか?より良いアプローチがありますか?

+2

質問を編集して、 'cython'の問題を強調しました。 – hpaulj

+0

誰かが理由を説明せずに質問に投票しました。 –

答えて

2

あなたは(同じことがあなたの「整数インデックスのリスト」のために働くだろう)ので、あなたが

otheThing = y.base[t,y_ind[t,:]] 

を行うことができ.baseでmemoryviewから根本的numpyの配列を取得することができます。

Cythonのメモリビューは、インデックスを作成する方法がかなり制限されています。実際には、整数とスライスだけです。これらは、フル機能のアレイクラスではなく、メモリにアクセスするための高速な方法として設計されています。

このようにスライスするときにCythonから速度を上げることはできません。もしこれがmemoryviewでやっているのであれば、それをタイプすることは何のメリットもありません。タイプのないPythonオブジェクト。 (あなたはそれでもあらかじめ便利なことをしているかもしれませんが)

関連する問題