取阵列中每2个数据点的平均值,创建一个新的阵列

时间:2019-03-14 20:40:12

标签: python arrays numpy

我试图获取数组中每2个值的平均值,并将新数据存储在新数组中。

据我所知:

y1 = np.array([1,2,3,4,5,6,7,8,9,10])

avgy = [0]*(len(y1)//2)

for i in range (0, len(y1)-1):
    if (2*(1+i)<=len(y1)):
        avgy[i] = ( y1[i+2[i]] + y1[2+2*i] )/2

print(avgy)

这是我收到的错误消息:

TypeError                                 Traceback (most recent call last)
<ipython-input-8-624d78987390> in <module>()
      9 for i in range (0, len(y1)-1):
     10     if (2*(1+i)<=len(y1)):
---> 11         avgy[i] = ( y1[i+2[i]] + y1[2+2*i] )/2
     12 
     13 print(avgy)

TypeError: 'int' object is not subscriptable

我将不胜感激。 奥利弗

4 个答案:

答案 0 :(得分:0)

我认为这是一个简单的错字。 y1[i+2[i]] + y1[2+2*i]应该是

y1[2*i] + y1[2*i+1]

Python列表从索引0开始。

您可能需要调整if

答案 1 :(得分:0)

一种简洁(如果有些棘手)的方法是创造性地使用切片和zip-请参见下面的控制台记录。

# Input data.
>>> y1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Look at the even and odd values.
>>> y1[::2], y1[1::2]
([1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

# Use zip to transpose these two lists of five into five lists of two.
>>> zip(*(y1[::2], y1[1::2]))
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

# Use a list comprehension over the pairs to average them.
>>> [(a + b) / 2. for (a, b) in zip(*(y1[::2], y1[1::2]))]
[1.5, 3.5, 5.5, 7.5, 9.5]

如果列表的长度不能被二整除,则会崩溃。

答案 2 :(得分:0)

y1 = [1,2,3,4,5,6,7,8,9,10]

avgy = []
for i in range(0,len(y1),2):
    avgy.append((y1[i]+y1[i+1])/2)

print(avgy)

这将为您提供平均值列表

答案 3 :(得分:0)

y1 = np.array([1,2,3,4,5,6,7,8,9,10)]

avgy = ((y1 + np.roll(y1,1))/2.0)[1::2]

编辑:此方法比for循环快约20倍,比使用zip和列表理解快约90倍。