三维numpy阵列的滚动平均/中心移动平均

64jmpszr  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个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数组。

nwwlzxa7

nwwlzxa71#

在1D中实现平滑的最简单方法是卷积。例如:

import numpy as np

# Length of smoother.
N = 11

# Make some fake data.
data = np.random.random((8035, 43, 43))

# Make a smoothing kernel.
kernel = np.ones(N) / N

# Convolve the kernel along the first (time) axis.
out = np.apply_along_axis(np.convolve, axis=0, arr=data, v=kernel, mode='same')

# Check the shape.
out.shape

np.convolve()是一个1D函数,因此np.apply_along_axis()负责沿着数据数组的时间(第一)轴应用它,这两个函数在NumPy信号处理中非常有用。
听起来你的数据中可能有一些NaN。这些会引起问题(例如,当你卷积时会扩散到结果中),所以你可能想先处理它们。
如果你想要一个不同的平滑函数(这个内核只取窗口中的平均值),或者你想在多个轴上进行过滤,那么你应该检查scipy.signalscipy.ndimage模块,那里有很多过滤器,你不需要np.apply_along_axis()-大多数scipy函数是n维的,所以你可以告诉它沿着哪个轴运行。
PS在NumPy中你几乎从来不需要循环(说真的,从来不需要)(当你在Python中循环时,你不需要计数器)。而且十有八九你也不需要Pandas。保持简单!

相关问题