numpy:如何最好地对齐两个排序的数组?

时间:2019-05-23 12:36:01

标签: python arrays algorithm numpy time-series

为了合并时间序列数据,我需要执行以下基本步骤:

>>> xs1
array([ 0, 10, 12, 16, 25, 29])
>>> xs2
array([ 0,  5, 10, 15, 20, 25, 30])

如何最好地获得以下解决方案:

>>> xs1_ = np.array([0,0,10,12,12,16,16,25,29,29])
>>> xs2_ = np.array([0,5,10,10,15,15,20,25,25,30])

这是为了对齐在时间x1x2进行的测量。

想象一下,在时间xs1上来自系列0的测量在该系列的下一次测量(即时间10)之前是有效的。我们可以将两个系列插值到它们的最大公约数,但这很可能1并造成巨大膨胀。因此,最好仅对xs1xs2的并集进行插值。在xs1_xs2_中,按列表索引对齐要比较的x值。即我们将5系列的时间xs2_0系列的时间xs1_进行比较,因为xs1_系列的下一次测量只是在时间{{1} }。从视觉的角度来看,想象一下两次测量的步长图(此处未显示y值),在这里我们总是比较彼此重叠的线。

尽管我正在为如何命名此任务而苦苦挣扎,但我认为这是一个普遍关心的问题,因此认为在这里提出最佳解决方案是适当的。

2 个答案:

答案 0 :(得分:2)

这是我的主张:

a=np.array([0,10,12,16,25,29])
b=np.array([0,5,10,15,20,25,30]) 
c=set(a).union(b) 
#c = {0, 5, 10, 12, 15, 16, 20, 25, 29, 30}
xs1_= [max([i for i in a if i<=j]) for j in c]
# [0, 0, 10, 12, 12, 16, 16, 25, 29, 29]
xs2 = [max([i for i in b if i<=j]) for j in c]
# [0, 5, 10, 10, 15, 15, 20, 25, 25, 30]

1)a和b是您的前两个列表。
2)c是一个集合,代表您两个数组之间的并集。这样,您将获得两个数组中都存在的所有值。
3)然后,对于该集合中的每个元素,我将选择a或b中存在的值的最大值,这些值保持小于或等于此元素。

答案 1 :(得分:1)

这是一种矢量化方法:

xs1 = np.array([ 0, 10, 12, 16, 25, 29])
xs2 = np.array([ 0,  5, 10, 15, 20, 25, 30])

# union of both sets
xs = np.array(sorted(set(xs1) | set(xs2)))
# array([ 0,  5, 10, 12, 15, 16, 20, 25, 29, 30])

xs1_ = np.maximum.accumulate(np.in1d(xs, xs1) * xs)
print(xs1_)
array([ 0,  0, 10, 12, 12, 16, 16, 25, 29, 29])

xs2_ = np.maximum.accumulate(np.in1d(xs, xs2) * xs)
print(xs_2)
array([ 0,  5, 10, 10, 15, 15, 20, 25, 25, 30])

两种情况都在哪里:

np.in1d(xs, xs1) * xs
# array([ 0,  0, 10, 12,  0, 16,  0, 25, 29,  0])

给一个数组,其中包含xsxs10中的值,而不包含那些值。我们只需要使用np.maximum.accumulate转发填充即可。