【问题标题】:Numpy: How to best align two sorted arrays?Numpy:如何最好地对齐两个排序数组?
【发布时间】:2019-10-10 00:54:11
【问题描述】:

为了合并时间序列数据,我只剩下以下基本步骤:

>>> 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 值。 IE。我们将时间5 系列xs2_ 与时间0 系列xs1_ 进行比较,因为系列xs1_ 中的下一个测量只是更晚,在时间10。从视觉的角度来看,想象一下两个测量值的阶梯图(此处未显示 y 值),我们总是比较彼此重叠的线。

虽然我正在为如何命名这项任务而苦恼,但我相信这是一个普遍关注的问题,因此认为在这里寻求最佳解决方案是合适的。

【问题讨论】:

  • “我们可以将这两个系列插入到它们的最大公约数,但这很可能是 1 并且会产生巨大的膨胀。” - 首先尝试此方法,并且仅在此解决方案证明不足时才对其进行优化。如果您还没有尝试过,那么您过早地进行了优化。

标签: python arrays algorithm numpy time-series


【解决方案1】:

这是我的建议:

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 中存在的值的最大值,它们仍然小于或等于这个元素。

【讨论】:

  • 太棒了,我一直在寻找的单线!
【解决方案2】:

这是一种矢量化方法:

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])

给出一个数组,其中包含xs 中的值,这些值包含在xs10 中。我们只需要使用np.maximum.accumulate 转发填充。

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2012-06-03
    • 2023-04-07
    • 2020-12-16
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多