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()返回一个Numpyfloat64
编辑:对于小数组(如您在问题中发布的数组),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()返回一个Numpyfloat64
编辑:对于小数组(如您在问题中发布的数组),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变换粗略地找到频率,然后对其进行带通滤波,然后使用过零或等效方法。