我有 2 个 x 和 y 位置的二维数组,用于表示等高线图的值。当我多次平移等高线图时,我需要在原始坐标移动时跟踪它们,以便我可以表达原始图像所有点的最终位移。
我正在使用 scipy.interpolate.interp1d 在 python3 中编写。经过一次迭代后,我没有出现任何问题,并且坐标已成功插回原始网格。我打印出 2D 数组中一列的最后 10 个元素:
import numpy as np
from scipy.interpolate import interp1d
print(y_coordinate[-10:, 20])
>>> [ 60. 61. 62. 63. 64. nan nan nan nan nan]
我有 nans,因为 64 像素宽的图像的 y 方向位移为 -5,因此顶部的 5 个像素已向下移动。问题是,在下一步中,我在 y 方向上的位移为零,因此这些点不会移动到此处,但它们可能会移动到我的大数组中的其他位置,因此需要对整个数组进行插值。
我使用 scipy.interpolate.interp1d 逐列插值(为了清楚起见,删除数组的索引,但知道它们与上面的前几行相同):
f = interp1d(y, y_coordinate, kind='linear', bounds_error = False)
new_y_coordinate = f(y)
其中 y_坐标如上面打印的那样,y 是
>>>[55,56,57,58,59,60,61,62,63,64]
所以本质上我希望它返回与我希望它插值的点上已经存在的值完全相同的值。相反,我得到了这个:
print(new_y_coordinate)
>>> [ 60. 61. 62. 63. nan nan nan nan nan nan]
我已经得到了很好的数据。奇怪的是,首先我尝试使用复数进行此操作,并认为使用这些数字是错误的。然后我将其更改为两个实数数组,发现错误已在数组的左侧解决(对于 x 方向平移),但现在发生在 y 位移平移的顶部。我在类似情况下做了一个简单的测试,根本没有出现这个错误。
关于发生的事情以及如何解决它有什么想法吗?
最佳答案
您应该在 interp1d
中传递 fill_value='extrapolate'
。以防万一,您还可以使用掩码过滤 nan 值。代码:
# assuming they are not np.arrays to begin with
y_coordinate = np.asarray(y_coordinate)
y = np.asarray(y)
mask = ~np.isnan(y)
f = interp1d(y[mask], y_coordinate[mask], kind='linear', bounds_error=False, fill_value='extrapolate')
关于python - 使用 interp1d 时,数组末尾的 NaN 会逐渐出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53744094/