如何将二维查找 table 映射到数组 (python)?
How to map a 2D lookup table to array (python)?
我有三个相同形状的二维数组,我们称它们为 theta、phi 和 A。
令 theta 和 phi 为从表面上不同距离看到的法向量的角度:
size = 100 # this value is fixed
x = np.arange(-size, size)
y = np.arange(-size, size)
xx, yy = np.meshgrid(xx, yy)
theta = np.arctan((xx**2+yy**2)**0.5 / 100) # angle from distance 100
phi = np.arctan((xx**2+yy**2)**0.5 / 1000) # angle from distance 1000
并设 A 为测量值的二维图,其中 x 轴为 theta,y 轴为已知线性步长的 phi(实际上与 theta 和 phi 的形状不同)。我需要的是表示为 A(x,y) 的 A(theta,phi) 的值。
看来我不知道如何将 A(theta,phi) 转换为 A(x,y),即使我知道 theta(x,y) 和 phi(x,y)。
我尝试了什么:
通过 scipy.interpolate.interp2d 我可以将 A 映射到与 theta 和 phi 相同数量的行和列。现在我可以遍历索引和 guess/round 数组中最匹配的索引
B = np.zeros(A.shape)
for i in range(0,A.shape[0]):
for j in range(0,A.shape[1]):
B[i,j] = A[int(f_theta*theta[i,j]),int(f_phi*phi[i,j])]
其中 f_theta 和 f_phi 是由索引步的测量步长确定的前置因子。
对我来说,这看起来是非常糟糕和低效的编码,并且像是对我实际想要做的事情的粗略近似(这是一个逆插值映射?)。它让我想起了 lookup-tables、坐标变换和插值,但是使用 none 这些关键字我找到了一些适合解决问题的方法。
我的 python 经验告诉我会有一个 module/function 我不知道。
编辑限制:
A(theta, phi) 中轴的范围大于 theta(x,y) 和 phi(x,y) 的范围,因此映射值始终存在。
我不需要将 B 映射回 A,因此不存在缺失值问题。
映射 A(theta, phi) 中的许多值将永远不会被使用。
编辑清晰度:
我将举一个小矩阵的例子,希望能澄清一些事情:
# phi given in degrees
phi = np.array([
[2,1,2],
[1,0,1],
[2,1,2],
])
# theta given in degrees
theta = np.array([
[6,4,6],
[4,0,5],
[6,5,6],
])
# A[0,0] is the value at phi=0deg, theta=0deg
# A[0,1] is the value at phi=1deg, theta=0deg
# A[1,1] is the value at phi=1deg, theta=1deg etc
# this is a toy example, the actual A cannot be constructed by a simple rule
A = np.array([
[0.0,0.1,0.2],
[1.0,1.1,1.2],
[2.0,2.1,2.2],
[3.0,3.1,3.2],
[4.0,4.1,4.2],
[5.0,5.1,5.2],
[6.0,6.1,6.2],
])
# what I want to reach:
B = [[6.2,4.1,6.2],
[4.1,0.0,5.1],
[6.2,5.1,6.2]]
我需要澄清一下,我在这里做了一些简化:
1) 对于给定的 theta,我可以通过查看 table 来检查相应的 phi:
theta[i,j] 对应于 phi[i,j]。但是这个例子的构造太简单了,他们没有,例如同源,它是嘈杂的数据,因此我无法给出分析表达式 theta(phi) 或 phi(theta)
2) 我的实际 theta 和 phi 中的值是浮点数,我的实际 A 也在非整数步长中测量(例如,theta 方向每步 0.45 度,phi 方向每步 0.2 度)
3) 原则上,由于 theta 和 phi 之间有严格的关系,我只需要一个特定的一维 "trace" 值 A 来找到 B,但我不明白如何找到这个轨迹,也没有如何从跟踪中创建 B。示例中的跟踪为 [A[0,0],A[4,1],A[5,1],A[6,2]] = [0.0,4.1,5.1,6.2]
例如,您可以执行双线性插值:
from scipy.interpolate import interpn
delta = [1.0, 1.0] # theta, phi
points = [np.arange(s)*d for s, d in zip(A.shape, delta)]
xi = np.stack((theta, phi), axis = -1)
B = interpn(points, A, xi)
这给出:
print(B)
[[6.2 4.1 6.2]
[4.1 0. 5.1]
[6.2 5.1 6.2]]
我有三个相同形状的二维数组,我们称它们为 theta、phi 和 A。 令 theta 和 phi 为从表面上不同距离看到的法向量的角度:
size = 100 # this value is fixed
x = np.arange(-size, size)
y = np.arange(-size, size)
xx, yy = np.meshgrid(xx, yy)
theta = np.arctan((xx**2+yy**2)**0.5 / 100) # angle from distance 100
phi = np.arctan((xx**2+yy**2)**0.5 / 1000) # angle from distance 1000
并设 A 为测量值的二维图,其中 x 轴为 theta,y 轴为已知线性步长的 phi(实际上与 theta 和 phi 的形状不同)。我需要的是表示为 A(x,y) 的 A(theta,phi) 的值。 看来我不知道如何将 A(theta,phi) 转换为 A(x,y),即使我知道 theta(x,y) 和 phi(x,y)。
我尝试了什么: 通过 scipy.interpolate.interp2d 我可以将 A 映射到与 theta 和 phi 相同数量的行和列。现在我可以遍历索引和 guess/round 数组中最匹配的索引
B = np.zeros(A.shape)
for i in range(0,A.shape[0]):
for j in range(0,A.shape[1]):
B[i,j] = A[int(f_theta*theta[i,j]),int(f_phi*phi[i,j])]
其中 f_theta 和 f_phi 是由索引步的测量步长确定的前置因子。 对我来说,这看起来是非常糟糕和低效的编码,并且像是对我实际想要做的事情的粗略近似(这是一个逆插值映射?)。它让我想起了 lookup-tables、坐标变换和插值,但是使用 none 这些关键字我找到了一些适合解决问题的方法。 我的 python 经验告诉我会有一个 module/function 我不知道。
编辑限制: A(theta, phi) 中轴的范围大于 theta(x,y) 和 phi(x,y) 的范围,因此映射值始终存在。 我不需要将 B 映射回 A,因此不存在缺失值问题。 映射 A(theta, phi) 中的许多值将永远不会被使用。
编辑清晰度: 我将举一个小矩阵的例子,希望能澄清一些事情:
# phi given in degrees
phi = np.array([
[2,1,2],
[1,0,1],
[2,1,2],
])
# theta given in degrees
theta = np.array([
[6,4,6],
[4,0,5],
[6,5,6],
])
# A[0,0] is the value at phi=0deg, theta=0deg
# A[0,1] is the value at phi=1deg, theta=0deg
# A[1,1] is the value at phi=1deg, theta=1deg etc
# this is a toy example, the actual A cannot be constructed by a simple rule
A = np.array([
[0.0,0.1,0.2],
[1.0,1.1,1.2],
[2.0,2.1,2.2],
[3.0,3.1,3.2],
[4.0,4.1,4.2],
[5.0,5.1,5.2],
[6.0,6.1,6.2],
])
# what I want to reach:
B = [[6.2,4.1,6.2],
[4.1,0.0,5.1],
[6.2,5.1,6.2]]
我需要澄清一下,我在这里做了一些简化:
1) 对于给定的 theta,我可以通过查看 table 来检查相应的 phi: theta[i,j] 对应于 phi[i,j]。但是这个例子的构造太简单了,他们没有,例如同源,它是嘈杂的数据,因此我无法给出分析表达式 theta(phi) 或 phi(theta)
2) 我的实际 theta 和 phi 中的值是浮点数,我的实际 A 也在非整数步长中测量(例如,theta 方向每步 0.45 度,phi 方向每步 0.2 度)
3) 原则上,由于 theta 和 phi 之间有严格的关系,我只需要一个特定的一维 "trace" 值 A 来找到 B,但我不明白如何找到这个轨迹,也没有如何从跟踪中创建 B。示例中的跟踪为 [A[0,0],A[4,1],A[5,1],A[6,2]] = [0.0,4.1,5.1,6.2]
例如,您可以执行双线性插值:
from scipy.interpolate import interpn
delta = [1.0, 1.0] # theta, phi
points = [np.arange(s)*d for s, d in zip(A.shape, delta)]
xi = np.stack((theta, phi), axis = -1)
B = interpn(points, A, xi)
这给出:
print(B)
[[6.2 4.1 6.2]
[4.1 0. 5.1]
[6.2 5.1 6.2]]