1

Pythonでコードを書いていますが、いくつか問題があります。2つの配列、たとえばAとBがあり、どちらにもIDが含まれています。AにはすべてのIDがあり、Bにはグループに属するIDがあります。私がやろうとしているのは、コードを使用してAのBの要素の位置を取得することです。

>>> print B
[11600813 11600877 11600941 ..., 13432165 13432229 13434277]
>>> mask=np.nonzero(np.in1d(A, B))
>>> print A[mask]
[12966245 12993389 12665837 ..., 13091877 12965029 13091813]

しかし、私はBの値を回復していないので、これは明らかに間違っています。numpy.in1d()正しく使用しているかどうかを確認して、次のことを試しました。

>>> mask=np.nonzero(np.in1d(A, B[0]))
>>> print A[mask]
[11600813]

正しいので、の「B」に問題があると思いnumpy.in1d()ます。ブール値np.in1d(A, B)をインデックスに変換する代わりに直接使用しようとしましたが、機能しませんでした。B = numpy.array(B)、も使ってみB = list(B)ましたが、どれもうまくいきませんでした。

しかし、私がそうする場合でもB = numpy.array(B)[0]B = list(B)[0]それはその要素に対して機能します。len(A)残念ながら、は16777216であり、 9166であるため、各要素に対して「for」サイクルを実行できませんlen(B)。これには多くの時間がかかります。

また、Bのすべての要素がAにあることを確認しました。

>>> np.intersect1d(A, B)
[11600813 11600877 11600941 ..., 13432165 13432229 13434277]
4

1 に答える 1

2

を使用してnumpy.argsortnumpy.searchsorted位置を取得できます。

import numpy as np
A = np.unique(np.random.randint(0, 100, 100))
B = np.random.choice(A, 10)

idxA = np.argsort(A)
sortedA = A[idxA]
idxB = np.searchsorted(sortedA, B)
pos = idxA[idxB]
print A[pos]
print B

より高速な方法が必要な場合は、パンダの使用を検討してください。

import pandas as pd
s = pd.Index(A)
pos = s.get_indexer(B)
print A[pos]
print B
于 2013-03-20T03:42:35.483 に答える