NumPy 最近邻线拟合穿过移动窗口

NumPy Nearest Neighbor Line Fitting Across Moving Window

提问人:TornadoEric 提问时间:2/13/2023 最后编辑:TornadoEric 更新时间:2/14/2023 访问量:59

问:

我将两个二维数组加载到 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 中实现两个随机索引选择以及跨索引的八个最近邻的计算,如果这能使所需的结果更容易理解:

Target Example One

Target Example Two

python 数组 numpy slice numpy-ndarray

评论

1赞 Michael Cao 2/14/2023
我假设你的意思是 8 个最近的邻居。对于边缘的索引,但不是角落,您还需要一个 3x3 窗口吗?因为从技术上讲,最近的 8 个邻居形成了一个三角形的窗口。
0赞 TornadoEric 2/14/2023
@MichaelCao错别字,是的,这里首选八个最近的邻居进行此计算!我可以用 3x3 网格为侧面/边缘的索引形成一个三角形窗口,我希望线拟合不会受到影响。

答:

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,0 case 0,1 case 0,2 case

评论

0赞 TornadoEric 2/15/2023
经过一些测试,我发现这个解决方案在各种阵列和邻居大小上都运行良好。我已经接受了您的回答,并感谢您的帮助!