Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单移动平均二维数组_Python_Arrays_Numpy - Fatal编程技术网

Python 简单移动平均二维数组

Python 简单移动平均二维数组,python,arrays,numpy,Python,Arrays,Numpy,我试图为2D数组的每一行计算一个简单的移动平均值。每行中的数据是一个单独的数据集,所以我不能只计算整个数组中的SMA,我需要在每行中分别进行计算。我尝试了for循环,但它将窗口作为行,而不是单个值 我用来计算SMA的方程式是:a1+a2+…an/n 这是我目前掌握的代码: import numpy as np #make amplitude array amplitude=[0,1,2,3, 5.5, 6,5,2,2, 4, 2,3,1,6.5,5,7,1,2,2,3,8,4,9,2,3

我试图为2D数组的每一行计算一个简单的移动平均值。每行中的数据是一个单独的数据集,所以我不能只计算整个数组中的SMA,我需要在每行中分别进行计算。我尝试了for循环,但它将窗口作为行,而不是单个值

我用来计算SMA的方程式是:a1+a2+…an/n 这是我目前掌握的代码:

import numpy as np  


#make amplitude array
amplitude=[0,1,2,3, 5.5, 6,5,2,2, 4, 2,3,1,6.5,5,7,1,2,2,3,8,4,9,2,3,4,8,4,9,3]


#split array up into a line for each sample
traceno=5                  #number of traces in file
samplesno=6                #number of samples in each trace. This wont change.

amplitude_split=np.array(amplitude, dtype=np.int).reshape((traceno,samplesno))

#define window to average over:
window_size=3

#doesn't work for values that come before the window size. i.e. index 2 would not have enough values to divide by 3
#define limits:
lowerlimit=(window_size-1)
upperlimit=samplesno

i=window_size

for row in range(traceno):
  for n in range(samplesno):
    while lowerlimit<i<upperlimit:
      this_window=amplitude_split[(i-window_size):i] 

      window_average=sum(this_window)/window_size

      i+=1
      print(window_average)
但我得到了:

[2.         3.         3.         4.66666667 2.66666667 3.66666667]
[2.66666667 3.66666667 5.         5.         4.         2.33333333]
[2.         4.33333333 7.         5.         6.33333333 2.33333333]

您可以使用卷积来计算
窗口大小的
[1,1,…,1]
,然后将其除以
窗口大小以获得平均值(无需循环):

卷积到
one
基本上是将窗口中的元素相加

输出:

[[1.         2.         3.33333333 4.66666667]
 [3.         2.66666667 2.66666667 3.        ]
 [4.         6.         4.33333333 3.33333333]
 [4.33333333 5.         7.         5.        ]
 [5.         5.33333333 7.         5.33333333]]

使用向量
np.ones(window\u size)/window\u size
,这应该很容易计算,但不幸的是,该函数似乎无法广播相关操作。下面是另一种简单的计算方法:

将numpy导入为np
振幅=[0,1,2,3,5.5,6,
5,   2,   2,   4,   2, 3,
1, 6.5,   5,   7,   1, 2,
2,   3,   8,   4,   9, 2,
3,   4,   8,   4,   9, 3]
traceno=5
样本编号=6
振幅分割=np.array(振幅,dtype=np.int)。重塑((traceno,samplesno))
窗口大小=3
#按窗口大小缩小
a=振幅分割*(1.0/窗口大小)
#跨列求和
b=np.累计(a,轴=1)
#添加一个初始的零列
c=np.pad(b,[(0,0),(1,0)])
#采取不同的手段
结果=c[:,窗口大小:]-c[:,:-窗口大小]
打印(结果)
# [[1.         2.         3.33333333 4.66666667]
#  [3.         2.66666667 2.66666667 3.        ]
#  [4.         6.         4.33333333 3.33333333]
#  [4.33333333 5.         7.         5.        ]
#  [5.         5.33333333 7.         5.33333333]]

您需要只使用numpy吗?您好,谢谢!我只是想检查一下我是否理解正确:np。1创建的数组是[1,1,1](这是卷积核?)。然后通过数组,将每个窗口乘以[1,1,1]并相加。这样我们得到第一个实例行(0+1+2),然后我们除以3得到平均值。这会在数组中滑动并重复。这正确吗?@okvoyce正如你所解释的那样。这是二维卷积,所以也会在每一行上进行。谢谢。只是一个简单的问题:我的“振幅”值对应于另一个包含时间值的数组。由于这种卷积,我需要重新缩放时间数组。是“未验证”列,还是最后两列?@okvoyce这取决于您要分配给每个平均值的时间。假设窗口时间是
(t1、t2、t3)
。如果您将
t1
分配给该平均值,则您是正确的,最后两列无效。如果您更愿意说
t2
更能代表该窗口的平均值,则删除第一列和最后一列。
from scipy.signal import convolve2d

window_average = convolve2d(amplitude_split, np.ones((1, window_size)), 'valid') / window_size)
[[1.         2.         3.33333333 4.66666667]
 [3.         2.66666667 2.66666667 3.        ]
 [4.         6.         4.33333333 3.33333333]
 [4.33333333 5.         7.         5.        ]
 [5.         5.33333333 7.         5.33333333]]