我有一些事件及其开始和结束时间步骤。数组“开始”代表4个事件的开始时间步长,数组“结束”代表这些事件的结束时间步长,数组“ prop”包含每个事件的一个数值属性(例如,在时间开始的第二个事件(1个索引)步骤12,并在时间步骤14完成,其属性为20)。数组“ diff”显示事件之间的差异(从上一个事件的结束到下一个事件的开始)。第一个事件的结束与第二个事件的开始之间的时间差为7个步骤。数组“ diff”比其他数组(“ start”,“ end”,“ prop”)小1个元素。
import numpy as np
start=np.array([3,12,16,30])
end = np.array([5,14,18,32])
prop=np.array([10,20,10,30])
diff=np.zeros(len(start)-1)
for i in range(1,len(start)):
diff[i-1] = start[i] - end[i-1]
print('diff',diff)
diff [ 7. 2. 12.]
在时间上接近的事件需要合并。如果2个相邻事件之间的差异小于3个时间步长,则需要合并它们。例如,第二个和第三个事件相差两个时间步长,因此它们将合并为一个新事件,该事件的开始时间为时间步长:12,结束时间步长为18。对于“ prop”数组,合并事件之间的最大值prop[i]
需要保留(prop[1] >prop[2]
),因此将20分配给新合并事件(merged_prop[1]=20
)。我想拥有三个具有所有事件(合并和未合并)特征的新数组:
merged_start=np.array([3,12,30])
merged_end = np.array([5,18,32]) #2nd and 3rd event have been merged
merged_prop=np.array([10,20,30])
我还附上了另一个较大的示例,以使我更加清楚自己想要的内容。第2个和第3个事件合并为1个大事件,第4个事件(直到(包括)第7个)合并了。
start_2=np.array([3,12,16,38,42,46,50,60])
end_2= np.array([5,14,32,40,44,48,54,70])
prop_2= np.array([10,8,20,10,35,10,10,10])
diff_2=np.zeros(len(start_2)-1)
for i in range(1,len(start_2)):
diff_2[i-1] = start_2[i] - end_2[i-1]
print('diff_2',diff_2)
diff_2 [7. 2. 6. 2. 2. 2. 6.]
#Desirable outputs
merged_start_2=np.array([3,12,38,60])
merged_end_2 = np.array([5,32,54,70])
merged_prop_2= np.array([10,20,35,10])
另一个例子
start_3 = np.array([ 3, 12, 18, 38, 42, 46, 50, 60])
end_3 = np.array([ 5, 14, 32, 40, 44, 48, 54, 70])
prop_3 = np.array([10, 8, 20, 10, 35, 10, 10, 10])
#Desirable outputs
merged_start_3=np.array([3,12,18,38,60])
merged_end_3 = np.array([5,14,32,54,70])
merged_prop_3= np.array([10,8,20,35,10])
我该怎么办?我能够从值小于3的数组“ diff”,“ diff_2”中提取索引,但是我不知道如何继续。
答案 0 :(得分:2)
这是您可以做到的方式:
import numpy as np
MERGE_THRESHOLD = 3
start = np.array([ 3, 12, 16, 38, 42, 46, 50, 60])
end = np.array([ 5, 14, 32, 40, 44, 48, 54, 70])
prop = np.array([10, 8, 20, 10, 35, 10, 10, 10])
# Gap between events
dists = start[1:] - end[:-1]
# Mask events to merge
m = dists >= MERGE_THRESHOLD
# Find first and last indices of each merged group
first_indices = np.flatnonzero(np.r_[True, m])
last_indices = np.r_[first_indices[1:], len(start)] - 1
# Make results
merged_start = start[first_indices]
merged_end = end[last_indices]
merged_prop_max = np.maximum.reduceat(prop, first_indices)
merged_prop_sum = np.add.reduceat(prop, first_indices)
elems_per_merge = last_indices - first_indices + 1
merged_prop_avg = merged_prop_sum / elems_per_merge
print(merged_start)
# [ 3 12 38 60]
print(merged_end)
# [ 5 32 54 70]
print(merged_prop_max)
# [10 20 35 10]
print(merged_prop_sum)
# [10 28 65 10]
print(merged_prop_avg)
# [10. 14. 16.25 10. ]