提问人:TornadoEric 提问时间:2/13/2023 最后编辑:TornadoEric 更新时间:2/14/2023 访问量:59
NumPy 最近邻线拟合穿过移动窗口
NumPy Nearest Neighbor Line Fitting Across Moving Window
问:
我将两个二维数组加载到 NumPy 中,它们的大小均为 80i x 80j。我希望对这些数组进行移动窗口多边形拟合计算,我已经确定了如何进行多边形拟合,但坚持了我希望完成的特定移动窗口方法。我的目标是:
1) 在数组 1 (a1) 的每个索引处,代码将索引的所有值及其最近的 8 个邻居隔离到一个单独的一维数组中,并在数组 2 (a2) 的同一窗口中重复
2) 隔离这两个新数组后,使用以下方法使用 NumPy 的 polyfit 执行线性回归线拟合:model = np.polyfit(a1slice, a2slice, 1)
3) 将生成的回归系数和截距(手动执行此操作的示例输出:)转换为其他两个数组的同一索引,其中将放入第一个新数组和该索引的第二个新数组中。array([-0.02114911, 10.02127152])
model[0]
model[1]
4) 然后,代码按顺序移动到下一个索引并再次执行步骤 1-3,或 a1(i+1、j+0 等)
我提供了一个图形示例,说明我尝试在数组 1 中实现两个随机索引选择以及跨索引的八个最近邻的计算,如果这能使所需的结果更容易理解:
答:
1赞
Michael Cao
2/14/2023
#1
我已经编写了一个函数来获取窗口,但是当索引在边缘并且距离角落有一段距离时,有一个麻烦的边缘情况。您可能希望修改该函数以准确获得所需的内容。
def get_neighbors(arr, origin, num_neighbors = 8):
coords = np.array([[i,j] for (i,j),value in np.ndenumerate(arr)]).reshape(arr.shape + (2,))
distances = np.linalg.norm(coords - origin, axis = -1)
neighbor_limit = np.sort(distances.ravel())[num_neighbors]
window = np.where(distances <= neighbor_limit)
exclude_window = np.where(distances > neighbor_limit)
return window, exclude_window, distances
test = np.zeros((5, 5))
plt.close('all')
cases = [[0,0], [0, 1], [0, 2]]
for case in cases:
window, exclude, distances = get_neighbors(test, case)
distances[exclude] = 0
plt.figure()
plt.imshow(distances)
图像输出:
评论
0赞
TornadoEric
2/15/2023
经过一些测试,我发现这个解决方案在各种阵列和邻居大小上都运行良好。我已经接受了您的回答,并感谢您的帮助!
评论