2

2 つの NumPy 配列があります。

A = asarray(['4', '4', '2', '8', '8', '8', '8', '8', '16', '32', '16', '16', '32'])
B = asarray(['2', '4', '8', '16', '32'])

パラメータとして取り、 の各値のインデックスをに合わせてA, B返す関数が必要です。可能な限り効率的に。BAA

上記のテスト ケースの出力は次のとおりです。

indices = [1, 1, 0, 2, 2, 2, 2, 2, 3, 4, 3, 3, 4]

in1d()where()、およびを調べてみましたがnonzero()、うまくいきませんでした。どんな助けでも大歓迎です。

編集:配列は文字列です。

4

5 に答える 5

1

私はあなたがそれを行うことができると思いますnp.searchsorted:

>>> A = asarray([4, 4, 2, 8, 8, 8, 8, 8, 16, 32, 16, 16, 32])
>>> B = asarray([2, 8, 4, 32, 16])
>>> sort_b = np.argsort(B)
>>> idx_of_a_in_sorted_b = np.searchsorted(B, A, sorter=sort_b)
>>> idx_of_a_in_b = np.take(sort_b, idx_of_a_in_sorted_b)
>>> idx_of_a_in_b
array([2, 2, 0, 1, 1, 1, 1, 1, 4, 3, 4, 4, 3], dtype=int64)

Bバージョンからスクランブルされているため、出力が異なることに注意してください。の項目の一部が含まれAていないB場合 ( で確認できますnp.all(np.in1d(A, B)))、それらの値の戻りインデックスはがらくたになりIndexError、最後の行から を取得することさえあります ( の最大値Aが にない場合B)。

于 2013-07-10T13:20:59.150 に答える
1

numpy_indexedパッケージ (免責事項: 私はその作成者です) は、Jaime のソリューションと同じ方針に沿ったソリューションを実装しています。しかし、素敵なインターフェース、テスト、および関連する多くの便利な機能を備えています。

import numpy_indexed as npi
print(npi.indices(B, A))
于 2016-04-02T15:26:10.457 に答える
1

そのようなことについては、ルックアップBをできるだけ速く行うことが重要です。ディクショナリはO(1)ルックアップ時間を提供します。それでは、まず、この辞書を作成しましょう。

>>> indices = dict((value,index) for index,value in enumerate(B))
>>> indices
{8: 2, 16: 3, 2: 0, 4: 1, 32: 4}

次に、A対応するインデックスを調べて見つけます。

>>> [indices[item] for item in A]
[1, 1, 0, 2, 2, 2, 2, 2, 3, 4, 3, 3, 4]
于 2013-07-10T09:56:45.067 に答える
0

これがどれほど効率的かはわかりませんが、機能します:

import numpy as np
A = np.asarray(['4', '4', '2', '8', '8', '8', '8', '8', '16', '32', '16', '16', '32'])
B = np.asarray(['2', '4', '8', '16', '32'])
idx_of_a_in_b=np.argmax(A[np.newaxis,:]==B[:,np.newaxis],axis=0)
print(idx_of_a_in_b)

私が得るもの:

[1 1 0 2 2 2 2 2 3 4 3 3 4]
于 2013-07-12T00:58:10.960 に答える