1

2 つの浮動配列があり、特定の範囲内で一致するデータ ポイントを検索したいと考えています。これは私がこれまでに得たものです:

import numpy as np

for vx in range(len(arr1)):
    match = (np.abs(arr2-arr1[vx])).argmin()
    if abs(arr1[vx]-arr2[match])<0.375:
        point = arr2[match]

問題は、arr1 に 150000 個の要素が含まれ、arr2 に約 110000 個の要素が含まれていることです。これには、ものすごい時間がかかります。物事をスピードアップするための提案はありますか?

4

2 に答える 2

3

ベクトル化されていないことに加えて、現在の検索は (n * m) です。ここで、n は arr2 のサイズ、m は arr1 のサイズです。この種の検索では、arr1 または arr2 をソートすると、バイナリ検索を使用できるようになります。n*log(n) ソートは (n*m) よりも高速であるため、ソートは最終的に最も遅いステップになりますが、m が大きい場合でも高速です。

ソートされた配列を使用してベクトル化された方法で検索を行う方法は次のとおりです。

def find_closest(A, target):
    #A must be sorted
    idx = A.searchsorted(target)
    idx = np.clip(idx, 1, len(A)-1)
    left = A[idx-1]
    right = A[idx]
    idx -= target - left < right - target
    return A[idx]

arr2.sort()
closest = find_closest(arr2, arr1)
closest = np.where(abs(closest - arr1) < .375, closest, np.nan)
于 2012-11-07T15:46:35.927 に答える
0

numpy を使用する全体的なアイデアは、ループを使用した計算を回避することです。

基準を満たす新しい配列を抽出する基準を指定することは、配列計算で簡単に実装できます。a以下は、その要素が配列内の対応する要素との絶対差が 0.75 未満であるという基準を満たす配列から値を抽出する例ですb:-

a = array([1, 0, 0.5, 1.2])

b = array([1.2, 1.1, 1.3, 1.4])

c = a[abs(a-b)<0.75]

それは私たちに与えます

array([ 1. ,  1.2])
于 2012-11-07T15:32:30.793 に答える