Есть ли различия в 3D-интерполяции между MATLAB и Numpy / Scipy? - PullRequest
2 голосов
/ 17 мая 2019

Я пользователь MATLAB и пытаюсь перевести некоторый код на Python как задание. Поскольку я заметил некоторые различия между этими двумя языками в результатах трехмерной интерполяции из моего исходного кода, я пытаюсь решить эту проблему, проанализировав простой пример.

Я установил матрицу 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)

Здесь я получаю значение = 3

1010 * 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. Не могли бы вы дать мне понять? Спасибо!

1 Ответ

1 голос
/ 17 мая 2019

Очевидно, что для MATLAB, когда X, Y и Z являются векторами, он считает, что порядок измерений в массиве значений равен (Y, X, Z).Из документации :

V - выборочные значения
массив

выборочные значения, указанные как действительные или сложныемассив.Требования к размеру V зависят от размера X, Y и Z:

  • Если X, Y и Z являются массивами, представляющимиполная сетка (в формате meshgrid), тогда размер V соответствует размеру X, Y или Z.
  • Если X, YZ - векторы сетки, тогда 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]
...