Растянуть вектор с нулевой длиной на произвольную длину без интерполяции - PullRequest
0 голосов
/ 23 декабря 2018

Я работаю с данными временных рядов с разными частотами дискретизации.

Мне нужно точно растянуть набор 1d векторов различной длины в общую произвольную длину.Значения следует повторять, а не интерполировать.

Однако количество повторений должно быть округлено в большую или меньшую сторону по всей цели, чтобы достичь определенной длины цели.

Мне кажется, что я не могуиспользуйте np.repeat, поскольку он округляет дробные числа повторов, а конечная длина всегда является точным кратным повторений.

В основном я ищу функцию с примерно следующим поведением:

stretch_func(np.array([1,2,4]), length=11)

out: [1,1,1,2,2,2,2,4,4,4,4]

stretch_func(np.array(["A","B"]), length=11)

out: ["A","A","A","A","A","B","B","B","B","B","B"]

РЕДАКТИРОВАТЬ:
Похоже, эта функция не является стандартной в numpy или пандах.Я пошел дальше и реализовал это так, вот это для любого, кому это может понадобиться:

def stretch_func(arr, length=1):
    repetitions = np.round(np.linspace(0,length,arr.shape[0]+1))[1:] - np.round(np.linspace(0,length,arr.shape[0]+1))[:-1]
    repeated = np.repeat(arr, repetitions.astype(np.int))
    return repeated

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Как вы узнали, repeat может использовать разное количество повторений для каждого элемента.Но выбор того, как распределить эти повторения, неоднозначен.Поэтому неудивительно, что нет упакованной формы вашей функции.

В качестве иллюстрации посмотрите, что split делает в обратном направлении:

In [3]: arr = np.array([1,1,1,2,2,2,2,4,4,4,4])
In [4]: np.split(arr,3)
...
ValueError: array split does not result in an equal division

array_splitвыполняет неравномерное разбиение без жалоб - но оно сокращает последний массив, а не первый, как вы решили:

In [5]: np.array_split(arr,3)
Out[5]: [array([1, 1, 1, 2]), array([2, 2, 2, 4]), array([4, 4, 4])]

Еще один момент - вычисление количества повторений, даже если оно неравномерно, выполняется быстро, снебольшая зависимость от размера массива.Так что нет необходимости выполнять такие вычисления в скомпилированном коде.Даже если бы такое расширение было обычной потребностью (а я так не думаю), оно было бы реализовано как функция, аналогичная той, что вы написали.Посмотрите на код для array_split, чтобы увидеть, как он обрабатывает крайние случаи.(что если, например, желаемая длина была меньше начальной?)

0 голосов
/ 23 декабря 2018

Если я правильно понял, вы можете использовать np.repeat и срез:

import numpy as np


def stretch_func(arr, length=1):
    reps = length // len(arr) + 1
    repeated = np.repeat(arr, reps)
    return repeated[-length:]

print(stretch_func(np.array([1,2,4]), length=11))
print(stretch_func(np.array(["A", "B"]), length=11))

Выход

[1 1 1 2 2 2 2 4 4 4 4]
['A' 'A' 'A' 'A' 'A' 'B' 'B' 'B' 'B' 'B' 'B']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...