了解 scipy.ndimage.map_coordinates 上的输入和输出
understanding inputs and outputs on scipy.ndimage.map_coordinates
我正在尝试在网格中的一组点上绘制一条直线。数据位于 x、y、z 坐标列表中。我认为 map_coordinates 是我想要的,但是我不理解输入和输出的形式...任何帮助将不胜感激。
list = [[x1, y1, z1]
[x2, y2, z2]
...
[xn, yn, zn]]
我要查找的值是 x 和 y 值。
look_up_values= [[x1, y1]
[x2, y2]
...
[xn, yn]]
我的问题是,为什么 map_coordinates 需要一个 (2,2)
数组以及输出中有什么信息(一个 2 值列表)。
这是一个可行的例子:
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
in_data = np.array([[0.,0.,0.]
,[0.,1.,.2]
,[0.,2.,.4]
,[1.,0.,.2]
,[1.,3.,.5]
,[2.,2.,.7]])
z = map_coordinates(in_data, np.array([[1.,1.],[1.,2.]]), order=1)
print z #I do not understand this output...
#[1. .2]
如果我不得不猜测我会说它在网格上的 2 个点之间进行插值,那么购买输出意味着什么?
map_coordinates
的输出是原始数组值在您指定的坐标处的插值。
在您的示例中,您输入了 [[1, 1], [1, 2]]
。这意味着您需要两个位置的插值:点 x=1,y=1 和 x=1,y=2。它需要两个数组,因为每个数组都是 x 和 y 坐标。 IE。您需要两个坐标:1,1 处的 x 坐标和 1,2 处的 y 坐标。
您选择的具体示例有点混乱,因为看起来 [1, 1]
对应于 [x0, y0]
这种解释是 不正确的 - 它实际上对应至 [x0, x1]
。超过 2 点就很清楚了:一般格式是 [[x0, x1, x2, ...], [y0, y1, y2, ...]]
.
您的输入可长可短,但数组的长度必须相同,因为它们是耦合的。
让我试着回答,首先检查一步一步的 1d 插值案例:
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import numpy as np
### 1d example of interpolation ###
in_data_x = np.array([1., 2., 3., 4., 5., 6.])
in_data_y = np.array([1.5, 2., 2.5, 3., 3.5, 4.]) # y = .5 x - 1
f = interp1d(in_data_x, in_data_y, kind='linear')
print(f)
# f in all of the points of the grid (in_data_x): output coincides with in_data_y
print(f(1), f(1.), f(1.5), f(2.), f(2.5), f(3.))
# f in a point outside the grid:
print(f(1.8))
# this is equal to y = .5 x - 1 for x = 1.8, up to some point.
assert round(0.5 * 1.8 + 1, ndigits=10) == round(f(1.8), ndigits=10)
# plot up to this point
xnew = np.arange(1, 6, 0.1)
ynew = f(xnew)
plt.plot(in_data_x, in_data_y, 'o', xnew, ynew, '-')
# close the image to move forward.
plt.show()
### another 1d example of interpolation ###
in_data_x = np.array([1., 2., 3., 4., 5., 6.])
in_data_y = np.array([-1.8, -1.2, -0.2, 1.2, 3., 5.2]) # y = .2 x**2 - 2
f = interp1d(in_data_x, in_data_y, kind='cubic')
print(f)
# f in all of the points of the grid (in_data_x): output coincides with in_data_y
print(f(1), f(1.), f(1.5), f(2.), f(2.5), f(3.))
# f in a point outside the grid:
print(f(1.8))
# this is equal to y = .2 x**2 - 2 for x = 1.8, up to some precision.
assert round(0.2 * 1.8 ** 2 - 2, ndigits=10) == round(f(1.8), ndigits=10)
# plot up to this point
xnew = np.arange(1, 6, 0.1)
ynew = f(xnew)
plt.plot(in_data_x, in_data_y, 'o', xnew, ynew, '-')
plt.show()
函数 interp1d 为您提供了一个插值器,它为您提供了通过某种算法(在本例中为线性)进行插值的值,该函数通过 x = [1., 2., 3., 4., 5 ., 6.] y = [-1.8, -1.2, -0.2, 1.2, 3., 5.2].
map_coordinates 做同样的事情。当您的数据具有多个维度时。
第一个主要区别是结果不是插值器,而是一个数组。
第二个主要区别是 x 坐标由数据维度的矩阵坐标给出。
第三个区别是输入必须作为列向量给出。
看这个例子
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
in_data = np.array([[0., -1., 2.],
[2., 1., 0.],
[4., 3., 2.]]) # z = 2.*x - 1.*y
# want the second argument as a column vector (or a transposed row)
# see on some points of the grid:
print('at the point 0, 0 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 0.]]).T, order=1))
print('at the point 0, 1 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 1.]]).T, order=1))
print('at the point 0, 2 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 2.]]).T, order=1))
# see some points outside the grid
print()
print('at the point 0.2, 0.2 of the grid, with linear interpolation z is:')
print(map_coordinates(in_data, np.array([[.2, .2]]).T, order=1))
print('and it coincides with 2.*.2 - .2')
print()
print('at the point 0.2, 0.2 of the grid, with cubic interpolation z is:')
print(map_coordinates(in_data, np.array([[0.2, .2]]).T, order=3)
终于回答了你的问题,你提供了输入
in_data = np.array([[0., 0., 0.],
[0., 1., .2],
[0., 2., .4],
[1., 0., .2],
[1., 3., .5],
[2., 2., .7]])
这是在矩阵坐标给定的网格上计算的函数 z(x,y):z(0, 0) = 0。
z(2, 2) = .7
问
z = map_coordinates(in_data, np.array([[1., 1.], [1., 2.]]), order=1)
表示询问z(1,1)和z(1,2),其中第二个输入数组按列读取。
z = map_coordinates(in_data, np.array([[.5, .5]]).T, order=1)
表示求z(0.5, 0.5)。注意输入中的转置 .T。
希望它确实有意义并且有帮助。
x 和 y 坐标指的是向量索引。
因此对于第 2 列和第 2 行 = z=2*2-2=-2 而不是 2
in_data = np.array([[0., -1., -2.],
[2., 1., 0.],
[4., 3., 2.]]) # z = 2.*x - 1.*y
# z array's values
# y = col
# x = row
# want the second argument as a column vector (or a transposed row)
# see on some points of the grid:
print('at the row 0 and col 0 of the grid the function z is: ')
print(ndimage.map_coordinates(in_data, np.array([[0., 0.]]).T, order=1,mode='nearest'))
print('at the row 0 and col 1 of the grid the function z is: ')
print(ndimage.map_coordinates(in_data, np.array([[0., 1.]]).T, order=1,mode='nearest'))
我正在尝试在网格中的一组点上绘制一条直线。数据位于 x、y、z 坐标列表中。我认为 map_coordinates 是我想要的,但是我不理解输入和输出的形式...任何帮助将不胜感激。
list = [[x1, y1, z1]
[x2, y2, z2]
...
[xn, yn, zn]]
我要查找的值是 x 和 y 值。
look_up_values= [[x1, y1]
[x2, y2]
...
[xn, yn]]
我的问题是,为什么 map_coordinates 需要一个 (2,2)
数组以及输出中有什么信息(一个 2 值列表)。
这是一个可行的例子:
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
in_data = np.array([[0.,0.,0.]
,[0.,1.,.2]
,[0.,2.,.4]
,[1.,0.,.2]
,[1.,3.,.5]
,[2.,2.,.7]])
z = map_coordinates(in_data, np.array([[1.,1.],[1.,2.]]), order=1)
print z #I do not understand this output...
#[1. .2]
如果我不得不猜测我会说它在网格上的 2 个点之间进行插值,那么购买输出意味着什么?
map_coordinates
的输出是原始数组值在您指定的坐标处的插值。
在您的示例中,您输入了 [[1, 1], [1, 2]]
。这意味着您需要两个位置的插值:点 x=1,y=1 和 x=1,y=2。它需要两个数组,因为每个数组都是 x 和 y 坐标。 IE。您需要两个坐标:1,1 处的 x 坐标和 1,2 处的 y 坐标。
您选择的具体示例有点混乱,因为看起来 [1, 1]
对应于 [x0, y0]
这种解释是 不正确的 - 它实际上对应至 [x0, x1]
。超过 2 点就很清楚了:一般格式是 [[x0, x1, x2, ...], [y0, y1, y2, ...]]
.
您的输入可长可短,但数组的长度必须相同,因为它们是耦合的。
让我试着回答,首先检查一步一步的 1d 插值案例:
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import numpy as np
### 1d example of interpolation ###
in_data_x = np.array([1., 2., 3., 4., 5., 6.])
in_data_y = np.array([1.5, 2., 2.5, 3., 3.5, 4.]) # y = .5 x - 1
f = interp1d(in_data_x, in_data_y, kind='linear')
print(f)
# f in all of the points of the grid (in_data_x): output coincides with in_data_y
print(f(1), f(1.), f(1.5), f(2.), f(2.5), f(3.))
# f in a point outside the grid:
print(f(1.8))
# this is equal to y = .5 x - 1 for x = 1.8, up to some point.
assert round(0.5 * 1.8 + 1, ndigits=10) == round(f(1.8), ndigits=10)
# plot up to this point
xnew = np.arange(1, 6, 0.1)
ynew = f(xnew)
plt.plot(in_data_x, in_data_y, 'o', xnew, ynew, '-')
# close the image to move forward.
plt.show()
### another 1d example of interpolation ###
in_data_x = np.array([1., 2., 3., 4., 5., 6.])
in_data_y = np.array([-1.8, -1.2, -0.2, 1.2, 3., 5.2]) # y = .2 x**2 - 2
f = interp1d(in_data_x, in_data_y, kind='cubic')
print(f)
# f in all of the points of the grid (in_data_x): output coincides with in_data_y
print(f(1), f(1.), f(1.5), f(2.), f(2.5), f(3.))
# f in a point outside the grid:
print(f(1.8))
# this is equal to y = .2 x**2 - 2 for x = 1.8, up to some precision.
assert round(0.2 * 1.8 ** 2 - 2, ndigits=10) == round(f(1.8), ndigits=10)
# plot up to this point
xnew = np.arange(1, 6, 0.1)
ynew = f(xnew)
plt.plot(in_data_x, in_data_y, 'o', xnew, ynew, '-')
plt.show()
函数 interp1d 为您提供了一个插值器,它为您提供了通过某种算法(在本例中为线性)进行插值的值,该函数通过 x = [1., 2., 3., 4., 5 ., 6.] y = [-1.8, -1.2, -0.2, 1.2, 3., 5.2].
map_coordinates 做同样的事情。当您的数据具有多个维度时。 第一个主要区别是结果不是插值器,而是一个数组。 第二个主要区别是 x 坐标由数据维度的矩阵坐标给出。 第三个区别是输入必须作为列向量给出。 看这个例子
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
in_data = np.array([[0., -1., 2.],
[2., 1., 0.],
[4., 3., 2.]]) # z = 2.*x - 1.*y
# want the second argument as a column vector (or a transposed row)
# see on some points of the grid:
print('at the point 0, 0 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 0.]]).T, order=1))
print('at the point 0, 1 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 1.]]).T, order=1))
print('at the point 0, 2 of the grid the function z is: ')
print(map_coordinates(in_data, np.array([[0., 2.]]).T, order=1))
# see some points outside the grid
print()
print('at the point 0.2, 0.2 of the grid, with linear interpolation z is:')
print(map_coordinates(in_data, np.array([[.2, .2]]).T, order=1))
print('and it coincides with 2.*.2 - .2')
print()
print('at the point 0.2, 0.2 of the grid, with cubic interpolation z is:')
print(map_coordinates(in_data, np.array([[0.2, .2]]).T, order=3)
终于回答了你的问题,你提供了输入
in_data = np.array([[0., 0., 0.],
[0., 1., .2],
[0., 2., .4],
[1., 0., .2],
[1., 3., .5],
[2., 2., .7]])
这是在矩阵坐标给定的网格上计算的函数 z(x,y):z(0, 0) = 0。 z(2, 2) = .7 问
z = map_coordinates(in_data, np.array([[1., 1.], [1., 2.]]), order=1)
表示询问z(1,1)和z(1,2),其中第二个输入数组按列读取。
z = map_coordinates(in_data, np.array([[.5, .5]]).T, order=1)
表示求z(0.5, 0.5)。注意输入中的转置 .T。 希望它确实有意义并且有帮助。
x 和 y 坐标指的是向量索引。
因此对于第 2 列和第 2 行 = z=2*2-2=-2 而不是 2
in_data = np.array([[0., -1., -2.],
[2., 1., 0.],
[4., 3., 2.]]) # z = 2.*x - 1.*y
# z array's values
# y = col
# x = row
# want the second argument as a column vector (or a transposed row)
# see on some points of the grid:
print('at the row 0 and col 0 of the grid the function z is: ')
print(ndimage.map_coordinates(in_data, np.array([[0., 0.]]).T, order=1,mode='nearest'))
print('at the row 0 and col 1 of the grid the function z is: ')
print(ndimage.map_coordinates(in_data, np.array([[0., 1.]]).T, order=1,mode='nearest'))