2

recarraysフィールドの1つと外部配列の間の共通の値に基づいて、numpy.recarrayのレコードをサブセット化しようとしています。例えば、

a = np.array([(10, 'Bob', 145.7), (20, 'Sue', 112.3), (10, 'Jim', 130.5)],
        dtype=[('id', 'i4'), ('name', 'S10'), ('weight', 'f8')])
a = a.view(np.recarray)

b = np.array([10,30])

a.idとbの共通部分を使用して、再配列からプルするレコードを決定したいので、次のように戻ります。

(10、'ボブ'、145.7)
(10、'ジム'、130.5)

素朴に、私は試しました:

common = np.intersect1d(a.id, b)
subset = a[common]

しかしもちろん、a [10]がないため、これは機能しません。また、idフィールドとインデックスの間に逆の辞書を作成し、そこからサブセット化することでこれを実行しようとしました。

id_x_index = {}
ids = a.id
indexes = np.arange(a.size)
for (id, index) in zip(ids, indexes):
    id_x_index[id] = index

subset_indexes = np.sort([id_x_index[x] for x in ids if x in b])
print a[subset_indexes]

しかし、この場合のように、a.idに重複がある場合は、id_x_indexのdict値をオーバーライドしています。

(10、'ジム'、130.5)
(10、'ジム'、130.5)

適切なインデックスを再配列に取り込むための簡単な方法を見落としていることはわかっています。手伝ってくれてありがとう。

4

2 に答える 2

1

また、古いバージョンのnumpyを使用している場合は、次の方法で実行することもできます。

subset = a[np.array([i in b for i in a.id])]
于 2011-03-10T23:23:45.180 に答える
1

Numpy でこれを行う最も簡潔な方法は次のとおりです。

subset = a[np.in1d(a.id, b)]
于 2011-03-10T19:08:27.770 に答える