26

numpy インデックスの簡単な例:

In: a = numpy.arange(10)
In: sel_id = numpy.arange(5)
In: a[sel_id]
Out: array([0,1,2,3,4])

sel_id によってインデックス付けされていない残りの配列を返すにはどうすればよいですか? 私が考えることができるのは:

In: numpy.array([x for x in a if x not in a[id]])
out: array([5,6,7,8,9])

もっと簡単な方法はありますか?

4

8 に答える 8

18

この単純な 1D のケースでは、実際にはブール値のマスクを使用します。

a = numpy.arange(10)
include_index = numpy.arange(4)
include_idx = set(include_index)  #Set is more efficient, but doesn't reorder your elements if that is desireable
mask = numpy.array([(i in include_idx) for i in xrange(len(a))])

これで、値を取得できます。

included = a[mask]  # array([0, 1, 2, 3])
excluded = a[~mask] # array([4, 5, 6, 7, 8, 9])

そのシナリオでの出力の順序が重要であるためa[mask]、必ずしも同じ結果が得られるとは限らないことに注意してください(ほぼ と同等である必要があります)。ただし、除外されたアイテムの順序が明確に定義されていないため、これは問題なく機能するはずです。a[include_index]include_indexa[sorted(include_index)]


編集

マスクを作成するより良い方法は次のとおりです。

mask = np.zeros(a.shape,dtype=bool)
mask[include_idx] = True

(セバーグに感謝) .

于 2012-09-20T18:17:28.363 に答える
5

ブール値マスクを使用すると、これをうまく行うことができます。

a = numpy.arange(10)

mask = np.ones(len(a), dtype=bool) # all elements included/True.
mask[[7,2,8]] = False              # Set unwanted elements to False

print a[mask]
# Gives (removing entries 7, 2 and 8):
[0 1 3 4 5 6 9]

追加 (@mgilson から取得)。作成されたバイナリ マスクは、元のスライスを取得するためにうまく使用できますが、a[~mask]これは元のインデックスが並べ替えられている場合にのみ同じです。


編集:np.delete現時点でバグがあると考える必要があるため、下に移動しました(2012年9月)。

を使用することもできますがnp.delete、マスクはより強力です (将来的には、それが問題ないオプションになると思います)。ただし、現時点では上記よりも遅く、負のインデックス (またはスライスが与えられた場合のステップ) で予期しない結果が発生します。

print np.delete(a, [7,2,8])
于 2012-09-20T20:33:19.837 に答える
4

それはもっと似ています:

a = numpy.array([1, 2, 3, 4, 5, 6, 7, 4])
exclude_index = numpy.arange(5)
include_index = numpy.setdiff1d(numpy.arange(len(a)), exclude_index)
a[include_index]
# array([6, 7, 4])

# Notice this is a little different from
numpy.setdiff1d(a, a[exclude_index])
# array([6, 7]
于 2012-09-20T18:07:12.900 に答える
1

ブールマスクを使用してこれを行いますが、少し異なります。これには、連続または非インデックスを使用して、N次元で作業するという利点があります。メモリ使用量は、マスクされた配列に対してビューまたはコピーが作成されたかどうかによって異なりますが、よくわかりません。

import numpy
a = numpy.arange(10)
sel_id = numpy.arange(5)
mask = numpy.ma.make_mask_none(a.shape)
mask[sel_id] = True
answer = numpy.ma.masked_array(a, mask).compressed()
print answer
# [5 6 7 8 9]
于 2012-09-20T22:24:32.187 に答える
0

また、それらが連続している場合は、[N:] 構文を使用して残りを選択します。たとえば、arr[5:] は、配列の最後から 5 番目の要素を選択します。

于 2012-09-20T18:17:15.287 に答える
-1

これが1D配列であるとするとa、インデックスのリストから不要なアイテムをポップすることができます。

accept = [i for i in range(a.size) if i not in avoid_list]
a[accept]

次のようなものを使用することもできます

accept = sorted(set(range(a.size)) - set(indices_to_discard))
a[accept]

アイデアは、不要なインデックスのセットを補完するものに派手なインデックスを使用することです。

于 2012-09-20T21:21:32.383 に答える
-1

numpy.setdiff1d(a, a[sel_id])トリックを行う必要があります。これよりもきれいなものがあるかどうかはわかりません。

于 2012-09-20T17:55:30.503 に答える