python - 如何更新数组中的每个元素以增加数据的平均值

Posted

技术标签:

【中文标题】python - 如何更新数组中的每个元素以增加数据的平均值【英文标题】:python - how to update every element in an array to increase the mean of the data 【发布时间】:2021-09-10 09:37:08 【问题描述】:

我有在 -4 和 4 之间标准化的音频数据;但是,我需要将波形/数据的“中心”(意思是?)以“1”为中心(请参见附图)

如何处理平均值被转换/转换为 ~1 的数据列表?同时仍保持 -4 到 4 的标准化

有没有使用 numpy 的简单方法来做到这一点?

【问题讨论】:

每个值增加1 - current_mean 在我看来你只需要在信号中添加 DC 值,简单来说需要添加大约 +2.5 以将信号电平提升到 1。然后你可以计算信号的平均值(1-avg) 将是您需要添加的内容 查看dsp.stackexchange.com/questions/40780/… @MZ 我喜欢将每个值增加1 - current_mean 的想法,但是随着每个元素都向上移动,我的数据不再在 -4 和 4 之间标准化;也许我应该在问题中说明这个要求 从您提供的图看来,您可以简单地将new_value = -old_value 发给我(我认为该标志在音频数据中不起作用?)。 【参考方案1】:

如果您将来提供一个示例来修补,那就太好了。第二个问题是你没有告诉我们使用什么类型的函数或者它应该保留什么属性。由于显然没有线性函数可以满足您的要求,因此我将使用二次函数。但首先这是我要修补的“声音”

np.random.seed(1)
x = np.linspace(0,0.01,10**4)
y = 0.1*np.sin(50*2*np.pi*x/(0.01))+np.random.random()*np.sin(50*2*np.pi*x/(0.01))*((0.0067<x)&(x<0.007))+((0.0067<x)&(x<0.007))*0.2
y -= y.mean()
plt.plot(x,y)

它不是你原来的那个,但它具有在居中后不在 -1 和 1 之间的属性。由于它看起来更干净,我将居中到零并且范围为 -1 和 1,但这应该没有真正的区别。我的计划是选择将最大值映射到 1、最小值映射到 -1 的唯一二次函数,然后选择一个好的值将 0 发送到即平均值为零的值。

import sympy
a,b,c = sympy.symbols('a, b, c')

def change_scale(arr, lamb=0):
    m = arr.min()
    M = arr.max()
    eqns = [a*x**2+b*x+c-y for x,y in zip([m,0,M],[-1,lamb,1])]
    sols = sympy.solve(eqns,[a,b,c])
    d,e,f = map(np.float64, sols.values())

    return d*arr**2+e*arr+f
    
y2 = change_scale(y)
print(y2.mean())
plt.plot(x,y2)

对我来说,这几乎看起来不错。唯一的问题是现在的平均值是-0.015。好吧,但为此我们有那个 lambda 参数。

快速检查显示 0.5 会很大,-0.5 会很小,这意味着这对于 scipy.optimize.bisect 来说是一个完美的工作。

from scipy.optimize import bisect
lamb = bisect(lambda x: change_scale(y,x).mean(),0.5,-0.5)

为我们提供了 lambda 的完美价值。图片是这样的

这正是我从那以后所期望的。平均值有点太小了,所以我们把事情调高了一点。现在均值为零,最大值为 1,最小值为 -1。

作为最后的健全性检查,我们可以绘制我们实际应用于值的函数:

【讨论】:

以上是关于python - 如何更新数组中的每个元素以增加数据的平均值的主要内容,如果未能解决你的问题,请参考以下文章

python初级(302) 7 列表冒泡排序

如何对元素多于每个块的线程数的数组执行并行扫描?

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

请问如何使用MATLAB进行元胞数组批量提取数据。

day4

python实现快速排序