首页 > 解决方案 > 是否有 python 友好的函数来计算 3D 数据的移动平均值?

问题描述

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

5x16 米网格上的热图

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();

标签: pythonpandasnumpymoving-average

解决方案


您可以通过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')

推荐阅读