web-dev-qa-db-ja.com

どのようにしてNumpyでインデックス配列をマスク配列に変えることができますか?

範囲を指定して、インデックスの配列を1と0の配列に変換することは可能ですか?つまり、[2,3]-> [0、0、1、1、0]、5の範囲

私はこのようなものを自動化しようとしています:

>>> index_array = np.arange(200,300)
array([200, 201, ... , 299])

>>> mask_array = ???           # some function of index_array and 500
array([0, 0, 0, ..., 1, 1, 1, ... , 0, 0, 0])

>>> train(data[mask_array])    # trains with 200~299
>>> predict(data[~mask_array]) # predicts with 0~199, 300~499
23
Efreeto

これが1つの方法です。

In [1]: index_array = np.array([3, 4, 7, 9])

In [2]: n = 15

In [3]: mask_array = np.zeros(n, dtype=int)

In [4]: mask_array[index_array] = 1

In [5]: mask_array
Out[5]: array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0])

マスクが常に範囲である場合、index_arrayを削除し、1をスライスに割り当てることができます。

In [6]: mask_array = np.zeros(n, dtype=int)

In [7]: mask_array[5:10] = 1

In [8]: mask_array
Out[8]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0])

整数ではなくブール値の配列が必要な場合は、作成時にmask_arraydtypeを変更します。

In [11]: mask_array = np.zeros(n, dtype=bool)

In [12]: mask_array
Out[12]: 
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False], dtype=bool)

In [13]: mask_array[5:10] = True

In [14]: mask_array
Out[14]: 
array([False, False, False, False, False,  True,  True,  True,  True,
        True, False, False, False, False, False], dtype=bool)
29

単一の次元の場合、次を試してください:

n = (15,)
index_array = [2, 5, 7]
mask_array = numpy.zeros(n)
mask_array[index_array] = 1

複数の次元の場合、n次元のインデックスを1次元のインデックスに変換してから、ravelを使用します。

n = (15, 15)
index_array = [[1, 4, 6], [10, 11, 2]] # you may need to transpose your indices!
mask_array = numpy.zeros(n)
flat_index_array = np.ravel_multi_index(
    index_array,
    mask_array.shape)
numpy.ravel(mask_array)[flat_index_array] = 1
5
Nicholas White

これをワンライナーとして実行するための素晴らしいトリックもあります。次のようにnumpy.in1d関数とnumpy.arange関数を使用します(最後の行が重要な部分です)。

>>> x = np.linspace(-2, 2, 10)
>>> y = x**2 - 1
>>> idxs = np.where(y<0)

>>> np.in1d(np.arange(len(x)), idxs)
array([False, False, False,  True,  True,  True,  True, False, False, False], dtype=bool)

このアプローチの欠点は、Warren Weckesserが提供したアプロップよりも〜10〜100倍遅いことです...しかし、それはワンライナーであり、探しているものとは異なる場合があります。

1
eteq

要求通り、ここが答えです。コード:

[x in index_array for x in range(500)]

あなたが要求したようにあなたにマスクを与えますが、それは0と1の代わりにブールを使用します。

0
genisage