在Python中获取数组中数字的时频?

2024-10-02 04:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个用numpy数组表示的时间序列,每3秒,我得到一个数据点。它看起来像这样(但是有更多的数据点):

z = np.array([1, 2, 1, 2.2, 3, 4.4, 1, 1.2, 2, 3, 2.1, 1.2, 5, 0.5])

我想找到一个阈值,平均每y秒一个数据点就会超过这个阈值(x)。你知道吗

从这个意义上说,也许我的问题更容易理解:假设我收集了一些关于每3秒钟有多少蚂蚁离开蚁丘的数据。使用这些数据,我想创建一个阈值(x),这样在将来,如果一次离开的蚂蚁数量超过x,我的蜂鸣器就会关闭。现在这是关键部分-我希望我的蜂鸣器大约每4秒钟响一次。我想使用Python来计算基于我已经收集的一系列数据,应该给x多少时间。你知道吗

在Python中有这样做的方法吗?你知道吗


Tags: 数据numpy数量np时间序列阈值数组
2条回答

我认为首先从统计学的角度来考虑这个问题是最容易的。我想你真正想说的是,你想计算100*(1-m/nth)百分位数,也就是数值低于1-m/nth的时间,其中m是你的采样周期,n是你想要的间隔。在您的示例中,它将是100*(1-3/4th)百分位或25th百分位。也就是说,您需要超过75%时间的值。你知道吗

因此,要对数据进行计算,应该使用scipy.stats.scoreatpercentile。因此,对于您的情况,您可以执行以下操作:

>>> z = np.array([1, 2, 1, 2.2, 3, 4.4, 1, 1.2, 2, 3, 2.1, 1.2, 5, 0.5])
>>> m = 3.
>>> n = 4.
>>> x = scipy.stats.scoreatpercentile(z, 100*(1-m/n))
>>> print(x)
1.05
>>> print((z>x).sum()/len(z))  # test, should be about 0.75
0.714285714286

当然,如果你有很多价值观,这个估计会更好。你知道吗

编辑:最初我将百分位数向后。它应该是1-m/n,但我最初只有m/n。你知道吗

假设触发器的1秒分辨率正常。。。你知道吗

import numpy as np
z = np.array([1, 2, 1, 2.2, 3, 4.4, 1, 1.2, 2, 3, 2.1, 1.2, 5, 0.5])
period = 3

将每个采样点除以其周期(以秒为单位),然后创建一个1秒数据数组-假设线性分布(?)对于每个样品。你知道吗

y = np.array([[n]*period for n in z / period])
y = y.flatten()

将数据重塑为四个秒周期(有损)

h = len(y) % 4
x = y[:-h]
w = x.reshape((4, len(x) / 4))

求每四秒周期的和,并求这些间隔的最小值

v = w.sum(axis = -1)
# use the min value of these sums
threshold = v.min() # 2.1

这为不重叠的4秒块提供了一个总阈值-但是它只为z生成6个触发器,表示42秒的数据。你知道吗


使用重叠的、滚动的窗口来寻找每四秒窗口总和的最小值(无损)

def rolling(a, window, step = 1):
    """

    Examples
        
    >>> a = np.arange(10)
    >>> print rolling(a, 3)
    [[0 1 2]
     [1 2 3]
     [2 3 4]
     [3 4 5]
     [4 5 6]
     [5 6 7]
     [6 7 8]
     [7 8 9]]
    >>> print rolling(a, 4)
    [[0 1 2 3]
     [1 2 3 4]
     [2 3 4 5]
     [3 4 5 6]
     [4 5 6 7]
     [5 6 7 8]
     [6 7 8 9]]
    >>> print rolling(a, 4, 2)
    [[0 1 2 3]
     [2 3 4 5]
     [4 5 6 7]
     [6 7 8 9]]
    >>>

    from http://stackoverflow.com/a/12498122/2823755
    """
    shape = ( (a.size-window)/step + 1   , window)
    strides = (a.itemsize*step, a.itemsize)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

t = rolling(y, 4)
s = t.sum(axis = -1)
threshold = s.min() # 1.3999999

这将为z生成8个触发器。你知道吗

相关问题 更多 >

    热门问题