在numpy recarray中找到关闭元素

时间:2012-11-26 12:14:51

标签: python numpy recarray

我正在尝试查找numpy记录数组no1中与rec数组no2中的值最接近的所有值(记录数组具有不同数量的值)

让我们说no1有字段:

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

其中time是特定事件的时间,no_of_interest_time索引应单独分析的事件。每个事件都被赋予这样的数字,并且多个事件可以共享相同的数字。 electrode保存记录事件的电极索引(位置)。

no2具有相同的字段,但包含不同的事件。

对于重新排列no2中的每个事件,我想找到来自同一类型(no1)和位置(no_of_interest_time)的重新排列electrode的最接近事件。

我使用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]

我将不胜感激任何建议。在此先感谢!!

1 个答案:

答案 0 :(得分:2)

这个怎么样:

closest_events = []
for t in no1:
    #sort
    i = np.argsort(np.abs(t['time']-no2['time']))
    # select only events with the same no_of_interest_time and electrode
    i = i[(no2['electrode']==t['electrode']) &
          (no2['no_of_interest_time']==t['no_of_interest_time'])]
    closest = i[0] if len(i)>0 else np.nan
    closest_events.append(closest)

我们的想法是,对于no1中的每个事件,您首先要计算此事件与no2中所有事件之间的距离。接下来,您将从最短到最长的距离排序并存储索引(i在函数中)。从i开始,您只选择特定类型和位置的元素,最后取出其余第一个索引(如果数组为空,则返回NaN)。

相关问题