python - MATLAB 和 Numpy/Scipy 之间的 3d 插值有什么不同吗?
问题描述
我是 MATLAB 用户,我正在尝试将 Python 中的一些代码翻译为作业。由于我注意到原始代码的 3d 插值结果中两种语言之间存在一些差异,因此我试图通过分析一个简单的示例来解决这个问题。
我用一些值设置了一个 2x2x2 矩阵(下面命名为 blocc),它的坐标在三个向量(X、Y、Z)中。给定一个查询点,我使用 3D 线性插值来查找插值。同样,我在 MATLAB 和 Python 中得到不同的结果(下面的代码)。
Python
import numpy as np
import scipy.interpolate as si
X,Y,Z =(np.array([1, 2]),np.array([1, 2]),np.array([1, 2]))
a = np.ones((2,2,1))
b = np.ones((2,2,1))*2
blocc = np.concatenate((a,b),axis=2) # Matrix with values
blocc[1,0,0]=7
blocc[0,1,1]=7
qp = np.array([2,1.5,1.5]) #My query point
value=si.interpn((X,Y,Z),blocc,qp,'linear')
print(value)
在这里我得到 value=3
MATLAB
blocc = zeros(2,2,2);
blocc(:,:,1) = ones(2,2);
blocc(:,:,2) = ones(2,2)*2;
blocc(2,1,1)=7;
blocc(1,2,2)=7;
X=[1,2];
Y=[1,2];
Z=[1,2];
qp = [2 1.5 1.5];
value=interp3(X,Y,Z,blocc,qp(1),qp(2),qp(3),'linear')
这里值=2.75
我不明白为什么:我认为在 Python 中插值和/或矩阵索引是如何工作的,我不明白。你能帮我说清楚吗?谢谢!
解决方案
显然,对于 MATLAB,当和是向量时X
,它认为 values 数组中维度的顺序是。从文档中:Y
Z
(Y, X, Z)
V
— 样本值
数组样本值,指定为实数或复数数组。的大小要求
V
取决于X
、Y
和的大小Z
:
- 如果
X
、Y
和Z
是表示完整网格(meshgrid
格式)的数组,则 的大小与、或的大小V
匹配。X
Y
Z
- 如果
X
、Y
和Z
是网格向量,则size(V) = [length(Y) length(X) length(Z)]
。如果
V
包含复数,则interp3
分别对实部和虚部进行插值。例子:
rand(10,10,10)
数据类型:
single | double
复数支持:是
这意味着,要在 Python 中获得相同的结果,您只需交换查询中的第一个和第二个值:
qp = np.array([1.5, 2, 1.5])
f = si.interpn((X, Y, Z), blocc, qp, 'linear')
print(f)
# [2.75]
推荐阅读
- linux - 如果屏幕旋转,fbdev 失败并崩溃以恢复
- angular - 在“...ge-2.2.1.tgz”},“engin”附近解析时出现错误的 JSON 输入意外结束
- reactjs - 如何使用 react-redux-i18n 动态更改语言
- python-3.x - 尝试访问块置信度时用于检测文档抛出错误的 Google Vision API
- go - 类型 INode* 是指向接口的指针,而不是接口
- android - 如何在新的谷歌控制台中启用谷歌地图 API v2
- mysql - 使用子查询和可能的连接来获取人口百分比
- javascript - 如何修复我的随机数生成器?
- python - 没有名为“termcolor”的模块
- javascript - Ext JS 6 无法右对齐我的按钮 xtype