2016-12-01 6 views

答えて

5

NumPy broadcasting魔法を使ってみよう!

a[numbers[:,None] > np.arange(a.shape[1])] 

サンプル実行 -

In [161]: a 
Out[161]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

In [162]: numbers 
Out[162]: array([3, 2, 0, 1, 2]) 

In [163]: numbers[:,None] > np.arange(a.shape[1]) # Mask to select elems 
Out[163]: 
array([[ True, True, True, False, False], 
     [ True, True, False, False, False], 
     [False, False, False, False, False], 
     [ True, False, False, False, False], 
     [ True, True, False, False, False]], dtype=bool) 

In [164]: a[numbers[:,None] > np.arange(a.shape[1])] # Select w/ boolean indexing 
Out[164]: array([ 0, 1, 2, 5, 6, 15, 20, 21]) 
+3

確か魔法です! :) – MYGz

+0

私は巨大な行列を持っており、最初の要素のごくわずかな部分だけを選択する必要があります。だから、このアプローチは、非常に小さなデータ量を得るために巨大なマスクマトリックスを構築するでしょう。したがって、漸近式はO(N)の代わりにO(N * N)になります。そしておそらく "for"ループが速くなるでしょう。この問題を解決する別のアプローチはありますか? – Stepochkin

+0

@Stepochkinこのアプローチではメモリが不足していますか?もしそうでなければ、これは依然として非常に効率的です。入力配列の形状であるデータサイズは何ですか?ブール値の配列であるため、メモリ要件は 'O(N * N)/ 8'になります。 – Divakar

関連する問題