Python 在numpy recarray中查找相近元素

Python 在numpy recarray中查找相近元素,python,numpy,recarray,Python,Numpy,Recarray,我试图从numpy记录数组no1中找到与rec数组no2中的值最接近的所有值(记录数组的值数不同) 假设no1有字段: ('electro','i4'),('no_of theu interest_time','i4'),('time','f8') 其中,time是特定事件的时间,no\u of\u interest\u time对应单独分析的事件进行索引。每个事件都有这样一个编号,多个事件可能共享相同的编号电极保存记录事件的电极索引(位置) no2具有相同的字段,但包含不同的事件 对于reca

我试图从
numpy
记录数组
no1
中找到与rec数组
no2
中的值最接近的所有值(记录数组的值数不同)

假设
no1
有字段:

('electro','i4'),('no_of theu interest_time','i4'),('time','f8')

其中,
time
是特定事件的时间,
no\u of\u interest\u time
对应单独分析的事件进行索引。每个事件都有这样一个编号,多个事件可能共享相同的编号<代码>电极保存记录事件的电极索引(位置)

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

对于recarray
no2
中的每个事件,我想从recarray
no1
中找到最接近的事件,它们具有相同的类型(
no\u interest\u time
)和位置(
电极

我可以用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]
我将感谢你的建议。提前谢谢

这个怎么样:

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