2

rec配列の値に最も近いnumpyレコード配列からすべての値を見つけようとしています(レコード配列の値の数は異なります)no1no2

no1フィールドがあるとしましょう:

('electrode', 'i4'), ('no_of_interest_time', 'i4'), ('time', 'f8')

ここで、timeは特定のイベントの時刻であり、no_of_interest_time個別に分析する必要があるイベントのインデックスを作成します。各イベントにはそのような番号が付けられ、複数のイベントが同じ番号を共有する場合があります。electrodeイベントが記録された電極のインデックスを保持します(場所)。

no2同じフィールドがありますが、異なるイベントを保持します。

recarrayの各イベントについて、同じタイプ()と場所( )のno2recarrayから最も近いイベントを見つけたいと思います。no1no_of_interest_timeelectrode

forループを使用して解決する方法は次のようになりますが、もっとエレガントな解決策を探しています。

import numpy as np

i_recarr1 = np.argsort(recarray1, order=['electrode', 'no_of_interest_time', 'time'])
recarr1_sorted = recarray1[i_recarr1]

i_recarr2 = np.argsort(recarray2, order=['electrode', 'no_of_interest_time', 'time'])
recarr2_sorted = recarray2[i_recarr2]

closest_events = recarr2_sorted.copy()

for electr in np.unique(recarr2_sorted['electrode']):
    # use only this electrode
    recarr1_record = recarr1_sorted[recarr1_sorted['electrode'] == electr]
    recarr1_record = recarr2_sorted[recarr2_sorted['electrode'] == electr]

    for interest in np.unique(recarr2_record['no_of_interest_time']):
        # use only this time of interest
        recarr1_interest = recarr1_sorted[recarr1_record['no_of_interest_time'] == interest]
        recarr2_interest = recarr1_sorted[recarr1_record['no_of_interest_time'] == interest]

        for idx, event2 in np.enumerate(recarr2_interest['time']):
            # loop through every event to find neighbours
            selected_idx = (np.abs(recarr1_interest['time']-event2)).argmin()
            closest_events[(closest_events['electrode'] == electr) & 
                           (closest_events['no_of_interest_time']) == interest][idx] = recarr1_interest['time'][selected_idx]

inverse_i = np.argsort(i_recarr2)       
closest_events[inverse_i]

アドバイスをいただければ幸いです。前もって感謝します!!

4

1 に答える 1