我正在尝试查找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]
我将不胜感激任何建议。在此先感谢!!
答案 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
)。