我正在努力执行一个简单的线性插值,将一个大小为Nx*Ny*Nz的数据空间转换成一个新的数据空间,以保持其他两个维度不变,即结果输出将是Nxnew*Ny*Nz.似乎RegularGridInterpolatorscipy似乎是要走的路,虽然,它不是直观的我如何生成输入.

from scipy.interpolate import RegularGridInterpolator
import numpy as np

x = np.linspace(1,4,11)
y = np.linspace(4,7,22)
z = np.linspace(7,9,33)
V = np.zeros((11,22,33))
for i in range(11):
    for j in range(22):
        for k in range(33):
            V[i,j,k] = 100*x[i] + 10*y[j] + z[k]
fn = RegularGridInterpolator((x,y,z), V)
pts = np.array([[[[2,6,8],[3,5,7]], [[2,6,8],[3,5,7]]]])
out = fn(pts)
print(out, out.shape)

在这个mwe中,我想使用新的点xnew = np.linspace(2,3,50),同时保持yz相同,这样得到的数组就变成了形状(50,22,33).此外,如何将其推广为n维数组沿一维的插值,同时保持其余坐标不变?

推荐答案

正如注释中所建议的,您可以用对np.meshgrid的调用来替换三进制嵌套循环,以使代码更具可读性和效率.

x, y, z = np.meshgrid(x, y, z, indexing='ij')
V = 100*x + 10*y + z

至于生成fn对象的输入,请注意,它的__call__ method需要形状(..., ndim)的输入.在本例中,...是您想要的形状(50、22、33),ndim是坐标的数量(xyz为3).我们可以使用meshgrid在三个单独的数组中生成坐标,但要形成fn的输入,我们需要以与坐标对应的轴位于最后的方式连接它们.有几种方法可以做到这一点,但最简单的是使用np.stack.

from scipy.interpolate import RegularGridInterpolator
import numpy as np

x0 = np.linspace(1, 4, 11)
y0 = np.linspace(4, 7, 22)
z0 = np.linspace(7, 9, 33)

x, y, z = np.meshgrid(x0, y0, z0, indexing='ij')
V = 100*x + 10*y + z

fn = RegularGridInterpolator((x0, y0, z0), V)

xnew = np.linspace(2, 3, 50)
x, y, z = np.meshgrid(xnew, y0, z0, indexing='ij')

xi = np.stack((x, y, z), axis=-1)
# or
# xi = np.moveaxis(np.asarray([x, y, z]), 0, -1)
# or
# xi = np.concatenate((x[..., np.newaxis, ], y[..., np.newaxis], z[..., np.newaxis]), axis=-1)

out = fn(xi)
print(out.shape)
# (50, 22, 33)

在你关于推广为"n维数组"的问题中,"n"的含义可能是不明确的.大概"n"代表坐标的数量,也就是你V的维度.在这种情况下,推广到任意数量坐标的情况是微不足道的:只要像我们在本例中处理xyz那样处理这些坐标(例如tuvw).

Python相关问答推荐

将特定列信息移动到当前行下的新行

连接两个具有不同标题的收件箱

Pytest两个具有无限循环和await命令的Deliverc函数

使用@ guardlasses. guardlass和注释的Python继承

使用密钥字典重新配置嵌套字典密钥名

在含噪声的3D点网格中识别4连通点模式

字符串合并语法在哪里记录

计算天数

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如何使regex代码只适用于空的目标单元格

如何找出Pandas 图中的连续空值(NaN)?

使用Python异步地持久跟踪用户输入

Python将一个列值分割成多个列,并保持其余列相同

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

有没有办法让Re.Sub报告它所做的每一次替换?

来自Airflow Connection的额外参数

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

如何在Pandas中用迭代器求一个序列的平均值?

为什么按下按钮后屏幕的 colored颜色 保持不变?

如何通过特定导入在类中执行Python代码