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])
確か魔法です! :) – MYGz
私は巨大な行列を持っており、最初の要素のごくわずかな部分だけを選択する必要があります。だから、このアプローチは、非常に小さなデータ量を得るために巨大なマスクマトリックスを構築するでしょう。したがって、漸近式はO(N)の代わりにO(N * N)になります。そしておそらく "for"ループが速くなるでしょう。この問題を解決する別のアプローチはありますか? – Stepochkin
@Stepochkinこのアプローチではメモリが不足していますか?もしそうでなければ、これは依然として非常に効率的です。入力配列の形状であるデータサイズは何ですか?ブール値の配列であるため、メモリ要件は 'O(N * N)/ 8'になります。 – Divakar