我有一些事件及其开始和结束时间步骤。数组“start”表示 4 个事件的开始时间步长,数组“end”表示这些事件的结束时间步长,数组“prop”包含每个事件的一个数字属性(例如,第 2 个事件(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 个时间步长,则它们需要合并。例如,第二个和第三个事件相差 2 个时间步长,因此它们将合并为一个新事件,其开始时间步长为:12,结束时间步长为 18)。对于“prop”数组,需要保留合并事件之间的最大 prop[i]
(prop[1] >prop[2]
),因此 20将分配给新的合并事件 (merged_prop[1]=20
)。我想要 3 个具有所有事件(合并和未合并)特征的新数组,如下所示:
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次也合并为1次大型事件。
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])
我该怎么做?我能够从数组“diff”、“diff_2”中提取索引,其值低于 3,但我不知道如何继续。
最佳答案
以下是您可以做到这一点的方法:
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. ]
关于python - 根据另外两个数组的前一个和后一个元素的差异创建新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61098661/