我有一个NumPy数组,包含8035个时间点,43个纬度点和43个经度点,我需要计算这个矩阵中每个点在8035个时间点上的移动平均值,我的数组的形状为(8035,43,43)。
def moving_average_centered(a,n):
return pd.Series(a).rolling(window=n, center=True).mean().to_numpy()
mat = np.zeros([31390])
cont = 0
for i in range(len(b)):
for j in range(len(b[i])):
for k in range(len(b[i][j])):
a=(moving_average_centered(b[i][j][k],11))
mat[cont]=a
cont = cont +1
我的数组看起来就像是NaN。代码中可能有什么错误?我想要一个形状为(8035,43,43)的NumPy数组。
1条答案
按热度按时间nwwlzxa71#
在1D中实现平滑的最简单方法是卷积。例如:
np.convolve()
是一个1D函数,因此np.apply_along_axis()
负责沿着数据数组的时间(第一)轴应用它,这两个函数在NumPy信号处理中非常有用。听起来你的数据中可能有一些NaN。这些会引起问题(例如,当你卷积时会扩散到结果中),所以你可能想先处理它们。
如果你想要一个不同的平滑函数(这个内核只取窗口中的平均值),或者你想在多个轴上进行过滤,那么你应该检查
scipy.signal
和scipy.ndimage
模块,那里有很多过滤器,你不需要np.apply_along_axis()
-大多数scipy
函数是n维的,所以你可以告诉它沿着哪个轴运行。PS在NumPy中你几乎从来不需要循环(说真的,从来不需要)(当你在Python中循环时,你不需要计数器)。而且十有八九你也不需要Pandas。保持简单!