この操作は、数百万の要素を含む実際の配列と同じくらい速く適用する必要があります。これは簡単な問題のバージョンです。numpyのin1dマスク関数より優れた処理をする:順序付けられた配列?
したがって、私はのユニークなの整数(通常は何百万という要素)のランダム配列を持っています。
totalIDsの= [5,4,3,1,2,9,7,6,8 ...]私は(通常は数十万の)一意の整数の別の配列を持っている
私はマスクを作ることができます。私は
マスク= np.in1d(totalIDs、subsampleIDs、assume_unique =真)
を行うためにnumpyのを使用することができます
subsampleIDs1 = [5,1,9]
subsampleIDs2 = [3,7,8]
subsampleIDs3 = [2,6,9]
...
私はその後、別の配列の私が欲しい情報を抽出することができますマスクを使用して(たとえば、カラム0には必要なものが含まれています)。
可変=のallvariables [マスク] [:, 0]次にIDが両方の配列内で一意であることを所与
は、有意にこれをスピードアップする方法があります。数百万のID(totalID)に一致する数千ポイント(サブサンプルID)のマスクを構築するには、長い時間がかかります。
私はそれを一度行って、インデックスのバイナリファイルを書き出すことを考えました(将来の検索を高速化するため)。
for i in range(0,3):
mask = np.in1d(totalIDs,subsampleIDs,assume_unique=True)
index[mask] = i
ここで、XはサブサンプルID Xである。それでは、私はできるだけ:
for i in range(0,3):
if index[i] == i:
rowmatch = i
break
variable = allvariables[rowmatch:len(subsampleIDs),0]
右か?しかし、これは遅いです。なぜなら、最初に一致するときに見つけるループの条件があるからです。条件付きでループを遅らせることがないように、番号が最初に順序付けられた配列に現れたときに、より速く発見する方法はありますか?
「範囲(0,3)」の部分を説明してください。「XはsubsampleIDsXにあります」とはどういう意味ですか?最後の質問に対する回答は「バイナリ検索」ですが、上記のコードとの関係について私の頭を覆すことはできません。 –
範囲(0,3)は、ファイル数をループすることを意味します。すなわちfile1、file2、file3、file4など.Xは最大のファイル番号を表す。 – Griff