代码之家  ›  专栏  ›  技术社区  ›  Sheldon

有没有更好的方法来重新采样存储在Python二进制文件中的时间序列?

  •  0
  • Sheldon  · 技术社区  · 7 年前

    我写下了一个函数来实现这个功能;下面是我的函数的简化版本:

    import numpy as np
    import scipy.signal as signal
    
    def resampleData(fileName_in,fileName_out,new_number_of_samples) 
    
        fIn = open(fileName_in, 'rb')
        data_in = np.fromfile(fIn, dtype="int32", count=-1, sep="")  
        fIn.close()
    
        data_out=signal.resample(data_in,new_number_of_samples).astype('int32')
    
        fOut = open(fileName_out, 'wb')
        data_out.tofile(fOut,sep="")
        fOut.close()
    
        return
    

    非常感谢你的帮助!

    1 回复  |  直到 7 年前
        1
  •  1
  •   ZisIsNotZis    7 年前

    我不认为IO是这里的问题,因为即使对于这个大数组:

    np.empty(1000000000, 'i').tofile('abc.bin')
    np.fromfile('abc.bin', 'i')
    

    只需要

    1.18 s ± 26.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    去读它。如果你坚持,你可以用 memmap :

    np.memmap('abc.bin', 'i')
    

    5.6 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    另一方面,如果通过重新采样意味着向下采样,则可以使用 记忆地图 方法直接保存原始数组的切片

    memmap_result[::2].tofile('xxx')
    

    把样品减半。

    memmap_result[np.linspace(0, len(memmap_result), num_samples).astype('i')]
    

    也应该很快。

    scipy.signal.resample 使用傅里叶变换,它应该非常快速和稳定。您可以使用更快的算法,如线性插值等,但重新采样的质量可能会受到影响。