python - 对一系列数字进行重采样(上采样、插值)

标签 python pandas numpy interpolation resampling

我有一系列以逗号分隔的整数值,我想对其进行重新采样,以便得到两倍的整数值,其中在每个现有值之间添加一个新值。例如,如果这是我的来源:

1,5,11,9,13,21

结果将是:

1,3,5,8,11,10,9,11,13,17,21

如果不清楚,我尝试在源系列中的每个值之间添加一个数字,如下所示:

1   5   11    9    13    21
1 3 5 8 11 10 9 11 13 17 21

我已经搜索了很多,似乎 scipy.signal.resample 或 panda 之类的东西应该可以工作,但我对此完全陌生,我还无法让它工作。例如,这是我对 scipy 的尝试之一:

import numpy as np
from scipy import signal
InputFileName = "sample.raw"
DATA250  = np.loadtxt(InputFileName, delimiter=',', dtype=int);
print(DATA250)
DATA500 = signal.resample(DATA250, 11)
print(DATA500)

哪些输出:

[ 1  5 11  9 13 21]
[ 1.         -0.28829461  6.12324489 10.43251996 10.9108191   9.84503237
  8.40293529 10.7641676  18.44182898 21.68506897 12.68267746]

显然我错误地使用了 signal.resample 。有没有办法用 signal.resample 或 panda 来做到这一点?我应该使用其他方法吗?

此外,在我的示例中,所有源数字之间都有一个整数。以我的实际数据来看,情况并非如此。因此,如果其中两个数字是 10,15,则新数字将为 12.5。但是我希望所有结果数字都是整数。因此插入的新数字需要是 12 或 13(对我来说是哪个并不重要)。

请注意,一旦我开始工作,源文件实际上将是一个由 2,000 个数字组成的逗号分隔列表,并且输出应该是 4,000 个数字(或者从技术上讲是 3,999 个数字,因为不会在末尾添加一个数字)。此外,这将用于处理类似于 ECG 记录的内容 - 当前 ECG 以 250 Hz 采样 8 秒,然后传递到单独的进程来分析记录。然而,这个单独的过程需要以 500 Hz 的频率对录音进行采样。因此,工作流程是我每 8 秒进行一次 250 Hz 记录,并将其上采样到 500 Hz,然后将结果输出传递到分析过程。

感谢您提供的任何指导。

最佳答案

由于插值很简单,您可以手动完成:

import numpy as np
a = np.array([1,5,11,9,13,21])
b = np.zeros(2*len(a)-1, dtype=np.uint32)
b[0::2] = a
b[1::2] = (a[:-1] + a[1:]) // 2

您还可以这样使用scipy.signal.resample:

import numpy as np
from scipy import signal
a = np.array([1,5,11,9,13,21])
b = signal.resample(a, len(a) * 2)
b_int = b.astype(int)

诀窍是元素数量恰好是两倍,以便奇数点与您的初始点相匹配。另外,我认为由 scipy.signal.resample 完成的傅立叶插值比您要求的线性插值更适合您的心电图信号。

关于python - 对一系列数字进行重采样(上采样、插值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938144/

相关文章:

python - 用numpy计算xlogx

python - 将 BST 转换为排序列表

python - Numpy:检索 `dtype` 的统一方式

python - pandas - 如何合并 DataFrame 中的选定行

python - 将项目附加到 Pandas Dataframe 以使其表现得像打印语句

python - 使用 Python 转换二进制文件(Labview .DAT 文件)

python - 按列比较 2 个 pandas 数据帧的行并保持更大和总和

Python:替换未知数量的字符串变量

Python OpenSSL C 扩展 : undefined symbol: AES_set_encrypt_key

python Pandas : NameError: name is not defined