是否有Python友好函数来计算3D数据的移动平均值?

问题描述

我正在尝试通过使用简单的移动平均滤波器来创建平滑的轮廓图。我有一个.CSV,它具有三列x,y(位置)和z(这是给定x,y的热量)。每列的值是23,236。我分别尝试了x和y的1d移动平均。考虑到数据的大小,它在平滑方面既不快速也不有效。我会寻求任何帮助。下面的代码绘制了等高线图。

heat map on a 5x16 m grid

df = 'D:/F1_amp .csv'
df = pd.read_csv("F1_amp.csv");
Z = df.pivot_table(index='x',columns='y',values='z').T.values
X_unique = np.sort(df.x.unique())
Y_unique = np.sort(df.y.unique())
X,Y = np.meshgrid(X_unique,Y_unique)

pd.DataFrame(Z).round(3)
pd.DataFrame(X).round(3)
pd.DataFrame(Y).round(3)

plt.contourf(X,Y,Z,20,cmap='hot')
plt.colorbar();

解决方法

您可以通过Convolution进行此操作。这种方法快速且易于推广。 对于2D卷积,可以使用scipy.signal.covolve2d()。您可以更改内核的大小和值,我以恒定的3x3内核为例。

import numpy as np
import scipy.signal as sg

kernel_shape = (3,3)
kernel = np.full(kernel_shape,1/np.prod(kernel_shape))
z = sg.convolve2d(z,kernel,mode='valid')