将numpy向量拉伸到任意长度而无需插值

时间:2018-12-23 15:16:46

标签: python pandas numpy

我正在处理具有不同采样频率的时间序列数据。

我需要将一组不同长度的1d向量准确地拉伸为一个公共的任意长度。 值应该重复而不是插值。

但是,应在整个目标范围内适当地对重复次数进行四舍五入,以达到特定的目标长度。

我似乎无法使用np.repeat,因为它舍入了重复的小数部分,并且最终长度始终是重复的精确倍数。

基本上我正在寻找一种具有以下行为的函数:

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

退出:[1,1,1,2,2,2,2,4,4,4,4]

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

输出:["A","A","A","A","A","B","B","B","B","B","B"]

编辑:
看起来此功能不是numpy或pandas中的标准功能。我继续并实现了这一点,所以在这里适用于可能需要它的其他任何人:

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 :(得分:1)

您发现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的代码以了解其如何处理边缘情况。 (例如,如果所需的长度小于初始长度,该怎么办?)

答案 1 :(得分:0)

如果我正确理解,可以使用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']