2016-08-19 15 views
0

numpyの高速索引索引を検索すると、実行中のコードが遅くなります(np.take())。私はnp.reshape()order=F/Cを試してみましたが改善はありません。ダブルtransposeなしでうまく動作しますが、彼らとoperator Pythonはnp.take().Numpy:配列の空想的なインデックス作成を改善する

p = np.random.randn(3500, 51) 
rows = np.asarray(range(p.shape[0])) 
cols = np.asarray([1,2,3,4,5,6,7,8,9,10,15,20,25,30,40,50]) 

%timeit p[rows][:, cols] 
%timeit p.take(cols, axis = 1) 
%timeit np.asarray(operator.itemgetter(*cols)(p.T)).T 

1000 loops, best of 3: 301 µs per loop 
10000 loops, best of 3: 132 µs per loop 
10000 loops, best of 3: 135 µs per loop 
+2

カラムをスライスしているようですが、 'p [:、cols]'はどうですか?それ以上のことはないと思ってはいけません。 – Divakar

答えて

2

いくつかのオプションのテストに等しい:

In [3]: p[rows][:,cols].shape 
Out[3]: (3500, 16) 
In [4]: p[rows[:,None],cols].shape 
Out[4]: (3500, 16) 
In [5]: p[:,cols].shape 
Out[5]: (3500, 16) 
In [6]: p.take(cols,axis=1).shape 
Out[6]: (3500, 16) 

時間テスト - 平野p[:,cols]は最速です。可能であればスライスを使用してください。

In [7]: timeit p[rows][:,cols].shape 
100 loops, best of 3: 2.78 ms per loop 
In [8]: timeit p.take(cols,axis=1).shape 
1000 loops, best of 3: 739 µs per loop 
In [9]: timeit p[rows[:,None],cols].shape 
1000 loops, best of 3: 1.43 ms per loop 
In [10]: timeit p[:,cols].shape 
1000 loops, best of 3: 649 µs per loop 

私はリストに使用itemgetterはなく、配列を見てきました。これは一連のインデックスを反復するクラスです。 p.T[c]p.T[c,:]またはp[:,c].Tであることを

In [23]: timeit np.asarray(operator.itemgetter(*cols)(p.T)).T.shape 
1000 loops, best of 3: 738 µs per loop 
In [24]: timeit np.array([p.T[c] for c in cols]).T.shape 
1000 loops, best of 3: 748 µs per loop 

は注意:これらの2行は同じことをやっています。 colsが比較的少なく、先進インデックスを無視してrowsとすると、p[:,cols]に近い回数になります。

関連する問題