我有三个相同形状的2D阵列,我们称它们为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相同数量的行和列。现在,我可以遍历索引并猜测/四舍五入数组中最匹配的索引
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是由索引步长的测量步长确定的因子。这对我来说似乎是非常糟糕且效率低下的编码,并且对我实际想要做的事情是粗略的近似(这是逆插值映射?)。它使我想起了查找表,坐标变换和插值,但是没有一个关键词能找到解决问题的合适方法。我的python经验大喊,将为此提供一个我不知道的模块/功能。
编辑限制: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,我可以通过查看表来检查相应的phi:theta [i,j]对应于phi [i,j]。但是示例的构造太简单了,例如共享相同的原点,这是嘈杂的数据,因此我无法给出解析表达式theta(phi)或phi(theta)
2)我的实际theta和phi中的值是浮点数,我的实际A也以非整数步进行度量(例如,在theta方向上每步0.45度,在phi方向上每步0.2度)
3)原则上,由于theta和phi之间存在严格的关系,因此我只需要值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]]