Numpy: Как лучше выровнять два отсортированных массива? - PullRequest
1 голос
/ 23 мая 2019

Чтобы объединить данные временного ряда, мне осталось сделать следующий важный шаг:

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

Это для выравнивания измерений, сделанных в моменты времени x1 и x2.

Представьте, что измерение из серии xs1 во время 0 действительно до тех пор, пока не будет выполнено следующее измерение в этой серии, то есть время 10. Мы могли бы интерполировать обе серии до их наибольших общих делителей, но это, скорее всего, 1 и создает огромное раздувание. Поэтому было бы лучше иметь интерполяцию только для объединения xs1 и xs2. В xs1_ и xs2_ выровнены по индексу списка значения x для сравнения. То есть мы сравниваем время 5 в серии xs2_ со временем 0 в серии xs1_, поскольку следующее измерение в серии xs1_ происходит только позже, во время 10. С визуальной точки зрения представьте пошаговый график для обоих измерений (значения y здесь не показаны), где мы всегда сравниваем линии, лежащие друг над другом.

Хотя я изо всех сил пытаюсь назвать эту задачу, я считаю, что это проблема общего интереса, и поэтому думаю, что здесь уместно спросить о ее лучшем решении.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Вот мое предложение:

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 голос
/ 23 мая 2019

Вот векторизованный подход:

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, содержащимися в xs1 и 0 для тех, которые не являются. Нам просто нужно переслать заполнение, используя np.maximum.accumulate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...