我正在处理具有不同采样频率的时间序列数据。
我需要将一组不同长度的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
答案 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']