python - 使用 numpy/scipy 中的插值填充 2d 矩阵中的缺失值
问题描述
我需要在二维矩阵中填写缺失值(给定为 0)。我将如何在 numpy/scipy 中完成它?我找到了 scipy.interpolate.interp2d函数,但我不太明白如何让它只填充零而不修改非零条目。
这是用于平滑图像的此函数的示例https://scipython.com/book/chapter-8-scipy/examples/scipyinterpolateinterp2d/
但这不是我要找的。我只想填写零值。
例如,矩阵是
import numpy as np
mat = np.array([[1,2,0,0,4], [1,0,0,0,8], [0,4,2,2,0], [0,0,0,0,8], [1,0,0,0,1]])
mat
array([[1, 2, 0, 0, 4],
[1, 0, 0, 0, 8],
[0, 4, 2, 2, 0],
[0, 0, 0, 0, 8],
[1, 0, 0, 0, 1]])
在这个矩阵中,所有的零都必须用插值替换,而原始值应该保持不变。我可以用什么来完成这项任务?
解决方案
您必须决定如何填充零。例如,您可以只使用数组中的平均值:
mat[mat == 0] = np.average(mat)
mat
# array([[1, 2, 1, 1, 4],
# [1, 1, 1, 1, 8],
# [1, 4, 2, 2, 1],
# [1, 1, 1, 1, 8],
# [1, 1, 1, 1, 1]])
或者您可以使用拟合到非零值的某些函数的值——scipy.interpolate.interp2d
使用“样条”(想想多项式):
from scipy.interpolate import interp2d
ix = np.where(mat != 0)
f = interp2d(ix[0], ix[1], mat[ix].flatten(), kind='linear')
mat2 = mat.copy()
mat2[mat==0] = f(range(5), range(5)).T[mat==0]
mat2
# array([[ 1, 2, 3, 4, 4],
# [ 1, 1, 1, 1, 8],
# [ 4, 4, 2, 2, 11],
# [ 4, 3, 2, 1, 8],
# [ 1, 0, 0, 0, 1]])
尽管我认为您会发现这种方法非常挑剔,尤其是对于如此小的数据集。
您还可以查看其他插补方法,例如最近的邻居等。
推荐阅读
- google-maps - 在 iFrame 中使用 Google Maps JavaScript API 和地图
- python - 根据来自另一个 DataFrame 的日期构建一个新的 Pandas DataFrame
- hadoop - 异常 CreateSymbolicLink 错误 (183) 当文件已存在时无法创建该文件
- amazon-web-services - 可以在没有开始时间/结束时间的情况下使用 aws-cli 开始查询功能吗?
- android - 为什么同一文件的 iOS 和 Android byteArray 内容在每个平台上都不同?
- python - 遇到打印 asccii-art 阴影字符的问题
- powershell - 使用 Perl 检查已安装的 Powershell 模块
- mysql - 按日期值获取日期时间字段的最新记录
- http - 在 HTTPS 上运行的 Vue 2 应用程序,尝试在同一 iis 服务器 http 上调用(axios)网络服务,调用是 https 而不是在开发工具中=
- dynamic - 在 AppKit 中构建带有文档内容的文档图标