gpt4 book ai didi

python - 根据两个其他数组的前后元素的差异创建新数组

转载 作者:行者123 更新时间:2023-12-04 10:15:09 25 4
gpt4 key购买 nike

我有一些带有开始和结束时间步长的事件。数组“start”表示4个事件的开始时间步长,数组“end”表示这些事件的结束时间步长,数组“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 个时间步长,则需要合并它们。例如第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 个也是如此。
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”中提取索引,但我不知道如何继续。

最佳答案

这是您可以做到的一种方法:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com