numpy确定参数之间的平均差值

numpy确定参数之间的平均差值,numpy,scipy,Numpy,Scipy,是否有现成的函数来确定排序列表的参数之间差异的平均值 例如,以下是我的手动尝试: import numpy as np rand_A = np.random.rand_integers(0, 99, 10) np.sort(rand_A) array([ 3, 8, 26, 34, 35, 37, 65, 82, 89, 94]) def mean_period(data): diffe = 0 for ind in range(data.shape[0] - 1)

是否有现成的函数来确定排序列表的参数之间差异的平均值

例如,以下是我的手动尝试:

import numpy as np
rand_A = np.random.rand_integers(0, 99, 10)
np.sort(rand_A)
array([ 3,  8, 26, 34, 35, 37, 65, 82, 89, 94])

def mean_period(data):
    diffe = 0
    for ind in range(data.shape[0] - 1)
        diffe += data[ind + 1] - data[ind]
    return (diffe / (data.shape[0] - 1))

mean_period(np.sort(rand_A))
10
基本上,我需要这个函数来确定窦状信号的频率值,它将被用作scipy.leastsq函数的初始猜测参数来拟合它。 我需要最快的程序。恐怕我的努力会很吃力

np.diff(np.sort(rand_A)).mean()
几乎相当于
mean_period(np.sort(rand_A))
,但应该更快,因为它使用NumPy方法调用而不是Python循环

我之所以说“几乎相等”,是因为有一个区别:
mean_period
总是返回一个int,因为
difference
是一个
numpy.int32
,返回值是这个
int32
除以
int
,(
data.shape[0]-1
)的结果

相反,
np.diff(np.sort(rand_A)).mean()返回一个Numpy
float64


编辑:对于小数组(如您在问题中发布的数组),Python循环速度更快:

In [84]: %timeit mean_period(np.sort(rand_A))
100000 loops, best of 3: 8.29 µs per loop

In [85]: %timeit np.diff(np.sort(rand_A)).mean()
10000 loops, best of 3: 21.5 µs per loop
但对于大型阵列,例如百万元素阵列

rand_A = np.random.random_integers(0, 99, 10**6)
使用NumPy的
mean
diff
方法要快得多:

In [87]: %timeit mean_period(np.sort(rand_A))
1 loops, best of 3: 442 ms per loop

In [88]: %timeit np.diff(np.sort(rand_A)).mean()
10 loops, best of 3: 48.8 ms per loop

另见:

几乎相当于
mean_period(np.sort(rand_A))
,但应该更快,因为它使用NumPy方法调用而不是Python循环

我之所以说“几乎相等”,是因为有一个区别:
mean_period
总是返回一个int,因为
difference
是一个
numpy.int32
,返回值是这个
int32
除以
int
,(
data.shape[0]-1
)的结果

相反,
np.diff(np.sort(rand_A)).mean()返回一个Numpy
float64


编辑:对于小数组(如您在问题中发布的数组),Python循环速度更快:

In [84]: %timeit mean_period(np.sort(rand_A))
100000 loops, best of 3: 8.29 µs per loop

In [85]: %timeit np.diff(np.sort(rand_A)).mean()
10000 loops, best of 3: 21.5 µs per loop
但对于大型阵列,例如百万元素阵列

rand_A = np.random.random_integers(0, 99, 10**6)
使用NumPy的
mean
diff
方法要快得多:

In [87]: %timeit mean_period(np.sort(rand_A))
1 loops, best of 3: 442 ms per loop

In [88]: %timeit np.diff(np.sort(rand_A)).mean()
10 loops, best of 3: 48.8 ms per loop

另见:


  • 让我们看看。如果我没弄错你们的问题,我们讨论的是频率检测器中的过零。您在列表中有过零点的时间戳(然后根据需要进行排序),并希望计算列表中项目的平均差异

    虽然联合国大学的答案是正确的,而且非常幼稚,但我想建议大家对数学做一个简单的研究。连续元素差的平均值为:

    { (s_1 - s_0) + (s_2 - s_1) + (s_3 - s_2) + ... + (s_n - s_(n-1)) } / n
    
    似乎有相当多的条款取消了。剩下的是:

    (s_n - s_0) / n
    
    因此,上述函数变为:

    def mean_period(data):
        return 1. * (data[-1] - data[0]) / (len(data) - 1)
    
    如果我们使用排序数据进行一些基准测试,那么:

    rand_A = np.random.randint(0,99999999,10000000)
    sort_A = np.sort(rand_A)
    
    % timeit np.diff(sort_A).mean()     # 37.7 ms
    % timeit mean_period(sort_A)        # 0.98 ms
    
    (后者本质上是O(1)加上它有轻微的函数调用开销)

    如果数据未排序,则我们必须找到最大值和最小值:

    def mean_period_unsorted(data):
        smallest = np.min(data)
        largest = np.max(data)
        return 1. * (largest - smallest) / (len(data) - 1)
    
    所以,也许这一次一点数学知识会有所帮助:) 现在是基准

    % timeit np.diff(np.sort(rand_A)).mean()   # 733 ms
    % timeit mean_period_unsorted(rand_A)      # 17.9 ms
    

    让我看看。如果我没弄错你们的问题,我们讨论的是频率检测器中的过零。您在列表中有过零点的时间戳(然后根据需要进行排序),并希望计算列表中项目的平均差异

    虽然联合国大学的答案是正确的,而且非常幼稚,但我想建议大家对数学做一个简单的研究。连续元素差的平均值为:

    { (s_1 - s_0) + (s_2 - s_1) + (s_3 - s_2) + ... + (s_n - s_(n-1)) } / n
    
    似乎有相当多的条款取消了。剩下的是:

    (s_n - s_0) / n
    
    因此,上述函数变为:

    def mean_period(data):
        return 1. * (data[-1] - data[0]) / (len(data) - 1)
    
    如果我们使用排序数据进行一些基准测试,那么:

    rand_A = np.random.randint(0,99999999,10000000)
    sort_A = np.sort(rand_A)
    
    % timeit np.diff(sort_A).mean()     # 37.7 ms
    % timeit mean_period(sort_A)        # 0.98 ms
    
    (后者本质上是O(1)加上它有轻微的函数调用开销)

    如果数据未排序,则我们必须找到最大值和最小值:

    def mean_period_unsorted(data):
        smallest = np.min(data)
        largest = np.max(data)
        return 1. * (largest - smallest) / (len(data) - 1)
    
    所以,也许这一次一点数学知识会有所帮助:) 现在是基准

    % timeit np.diff(np.sort(rand_A)).mean()   # 733 ms
    % timeit mean_period_unsorted(rand_A)      # 17.9 ms
    

    这不是零交叉;这里我的观点对应于极大值。零交叉会使事情复杂化,因为有两个/周期。对,数学上的简化显然让事情变得更快。但事实上,当我在研究噪声实验数据时,我需要另一种方法。也许我会使用傅里叶变换。@user1850133:在嘈杂的环境中,频率检测异常复杂。零交叉与滞后和死区时间窗口是一种可能性,但即使这样,其他频率分量也会导致问题。傅里叶变换是一个很好的候选者,因为它已经进行了彻底的优化,但至少有两件事需要考虑:频率峰值的加窗和插值。此外,如果你的频率有一点变化,你可能需要先用F变换粗略地找到频率,然后带通滤波,然后使用过零或等效的方法;这里我的观点对应于极大值。零交叉会使事情复杂化,因为有两个/周期。对,数学上的简化显然让事情变得更快。但事实上,当我在处理嘈杂的实验数据时,我需要另一个平均值。也许我会使用傅里叶变换。@user1850133:在嘈杂的环境中,频率检测异常复杂。零交叉与滞后和死区时间窗口是一种可能性,但即使这样,其他频率分量也会导致问题。傅里叶变换是一个很好的候选者,因为它已经进行了彻底的优化,但至少有两件事需要考虑:频率峰值的加窗和插值。此外,如果频率有一点变化,您可能需要首先使用F变换粗略地找到频率,然后对其进行带通滤波,然后使用过零或等效方法。