この操作は、数百万の要素を含む実際の配列としてできるだけ速く適用する必要があります。これは問題の簡単なバージョンです。
したがって、一意の整数 (通常は数百万の要素)のランダムな配列があります。
totalIDs = [5,4,3,1,2,9,7,6,8 ...]
マスクを作成できる一意の整数の別の配列 (通常は数万) があります。
subsampleIDs1 = [5,1,9]
subsampleIDs2 = [3,7,8]
subsampleIDs3 = [2,6,9]
...
numpy を使用して行うことができます
mask = np.in1d(totalIDs,subsampleIDs,assume_unique=True)
次に、マスクを使用して別の配列から必要な情報を抽出できます (たとえば、必要な情報が列 0 に含まれているとします)。
variable = allvariables[マスク][:,0]
ID が両方のアレイで一意であることを考えると、これを大幅に高速化する方法はありますか。数百万の ID (totalID) と一致する数千のポイント (subsampleID) のマスクを作成するには、長い時間がかかります。
一度それを調べて、インデックスのバイナリ ファイルを書き出すことを考えました (将来の検索を高速化するため)。
for i in range(0,3):
mask = np.in1d(totalIDs,subsampleIDs,assume_unique=True)
index[mask] = i
ここで、X は subsampleIDsX にあります。次に、次のことができます。
for i in range(0,3):
if index[i] == i:
rowmatch = i
break
variable = allvariables[rowmatch:len(subsampleIDs),0]
右?ただし、最初に一致するタイミングを見つけるための条件がループ内にあるため、これも遅くなります。条件がループを遅くしないように、番号が順序付けられた配列に最初に表示されたときを見つけるためのより高速な方法はありますか?