2

我有一个数组,其中记录和存储谨慎的正弦波值。我想找到波形的最大值和最小值。由于正弦波数据是使用 DAQ 记录的电压,因此会有一些噪声,所以我想做一个加权平均。假设 self.yArray 包含我的正弦波值,这是我到目前为止的代码:

filterarray = []
filtersize = 2
length = len(self.yArray)
for x in range (0, length-(filtersize+1)):
   for y in range (0,filtersize):
      summation = sum(self.yArray[x+y])
      ave = summation/filtersize
      filterarray.append(ave)

我的问题似乎在第二个 for 循环中,根据我的平均窗口大小(filtersize),我想总结窗口中的值以取它们的平均值。我收到一条错误消息:

summation = sum(self.yArray[x+y])
TypeError: 'float' object is not iterable

我是一个在编程方面经验很少的 EE,所以任何帮助将不胜感激!

4

5 回答 5

10

其他答案正确地描述了您的错误,但是这种类型的问题确实需要使用 numpy. Numpy 将运行得更快,内存效率更高,并且对于此类问题更具表现力和方便性。这是一个例子:

import numpy as np
import matplotlib.pyplot as plt

# make a sine wave with noise
times = np.arange(0, 10*np.pi, .01)
noise = .1*np.random.ranf(len(times))
wfm = np.sin(times) + noise

# smoothing it with a running average in one line using a convolution
#    using a convolution, you could also easily smooth with other filters
#    like a Gaussian, etc.
n_ave = 20
smoothed = np.convolve(wfm, np.ones(n_ave)/n_ave, mode='same')

plt.plot(times, wfm, times, -.5+smoothed)
plt.show()

在此处输入图像描述

如果您不想使用 numpy,还应注意您的程序中存在逻辑错误,导致TypeError. 问题是在行

summation = sum(self.yArray[x+y])

您在sum循环中使用,您还计算总和。因此,要么您需要在sum没有循环的情况下使用,要么循环遍历数组并将所有元素相加,但不能同时使用两者(并且它同时进行,应用于sum索引数组元素,这首先会导致错误) . 也就是说,这里有两种解决方案:

filterarray = []
filtersize = 2
length = len(self.yArray)
for x in range (0, length-(filtersize+1)):
    summation = sum(self.yArray[x:x+filtersize]) # sum over section of array
    ave = summation/filtersize
    filterarray.append(ave)

或者

filterarray = []
filtersize = 2
length = len(self.yArray)
for x in range (0, length-(filtersize+1)):
    summation = 0.
    for y in range (0,filtersize):
        summation = self.yArray[x+y]
    ave = summation/filtersize
    filterarray.append(ave)
于 2013-05-29T18:24:01.760 回答
7

self.yArray[x+y]正在从列表中返回单个项目self.yArray。如果您尝试获取 的子集,则yArray可以改用切片运算符:

summation = sum(self.yArray[x:y])

返回sum内置函数可以使用的可迭代对象。

可以在此处找到有关 python 切片的更多信息(向下滚动到“序列”部分):http ://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy

于 2013-05-29T18:13:27.540 回答
4

您可以使用 numpy,例如:

import numpy
filtersize = 2
ysums = numpy.cumsum(numpy.array(self.yArray, dtype=float))
ylags = numpy.roll(ysums, filtersize)
ylags[0:filtersize] = 0.0
moving_avg = (ysums - ylags) / filtersize
于 2013-05-29T18:22:32.693 回答
1

您的原始代码尝试对存储在的浮点值调用 sum yArray[x+y],其中x+y计算为表示该浮点值索引的某个整数。

尝试: summation = sum(self.yArray[x:y])

于 2013-05-29T18:15:19.943 回答
0

确实 numpy 是要走的路。python 的一个很好的特性是列表推导,允许您取消典型的嵌套 for 循环结构。这是一个示例,针对您的特定问题...

import numpy as np
step=2
res=[np.sum(myarr[i:i+step],dtype=np.float)/step for i in range(len(myarr)-step+1)]
于 2013-05-29T20:26:53.480 回答