python - 根据另外两个数组的前一个和后一个元素的差异创建新数组

标签 python arrays numpy

我有一些事件及其开始和结束时间步骤。数组“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/

相关文章:

Python 子图函数参数

python - 在 Python 中,我如何制作一个 numpy 矩阵列的副本,以便对副本的任何进一步操作都不会影响原始矩阵?

python - Julia 矩阵乘法比 numpy 的慢

python - Turtle() 不旋转多个球加上属性错误

python - 使用python从数组中删除重复数据

python - 如何用Python将用户输入转换为列表?

python - 根据另一个字段中的选择显示/隐藏 django 管理表单字段

javascript - 仅获取数组的一个元素及其子元素

C++ 数组和指针调用类型

python - 保留 Numpy 3d 数组中切片的尺寸