如何根据 python 中的一些不规则点制作规则网格

how to make a regular grid base on some irregular points in python

我有一个 xy 坐标的 numpy 数组,我想让它规则化。该数组根据其 x 值(第一列)排序:

import numpy as np
Irregular_points = np.array([[1.1,5.], [0.85,7.1], [0.9,9], [1.1,11], [1.,13.1],
                   [1.9,5.2], [2.,6.9], [1.95,9], [2.1,11.1], [2.,13.1],
                   [3.0,5.1], [3.1,7.0], [3.,9], [3.0,11.], [3.1,12.8]])

我想先找出哪些点的x值几乎相同:前五行,中间五行,最后五行。找到这些点的一个信号是当我转到下一组时 y 值减小。然后,我想用平均值替换每个组的 x 值。例如,在前五行中 x 的值是 1.10.850.91.11.,平均值是 0.98.我想对接下来的两部分做同样的事情。

对于y 值,我再次想找到属于五组的相似值,然后用每组的平均值替换它们。第一组的 y 值为 5.5.25.1,平均值为 5.1。最后,我的点应该像下面的数组:

Regular_points = np.array([[0.98,5.1], [0.98,7.0], [0.98,9.0], [0.98,11.03], [0.98,13.0],
                   [1.98,5.1], [1.98,7.0], [1.98,9.0], [1.98,11.03], [1.98,13.0],
                   [3.04,5.1], [3.04,7.0], [3.04,9.0], [3.04,11.03], [3.04,13.0]])

我尝试 round 数字,但它不适用于真实案例,我需要计算这些平均值。我非常感谢任何帮助。该图清楚地显示了我想要的。红点是不规则的点,但通过替换平均值,可以得到蓝点。

由于您要对行和列进行平均,因此您需要使用不同的形状。然后分离 xy 坐标,按不同的轴对它们进行平均,并使用 np.transpose + np.meshgrid 进行漂亮的显示:

irregular_points = np.array([[1.1,5.], [0.85,7.1], [0.9,9], [1.1,11], [1.,13.1],
                             [1.9,5.2], [2.,6.9], [1.95,9], [2.1,11.1], [2.,13.1],
                             [3.0,5.1], [3.1,7.0], [3.,9], [3.0,11.], [3.1,12.8]])

points_reshape = irregular_points.reshape(3, 5, 2)
x, y = np.transpose(points_reshape)
x_mean = x.mean(axis=0)
y_mean = y.mean(axis=1) 
regular_points = np.transpose(np.meshgrid(x_mean, y_mean))
regular_points
>>> 
array([[[ 0.99      ,  5.1       ],
        [ 0.99      ,  7.        ],
        [ 0.99      ,  9.        ],
        [ 0.99      , 11.03333333],
        [ 0.99      , 13.        ]],

       [[ 1.99      ,  5.1       ],
        [ 1.99      ,  7.        ],
        [ 1.99      ,  9.        ],
        [ 1.99      , 11.03333333],
        [ 1.99      , 13.        ]],

       [[ 3.04      ,  5.1       ],
        [ 3.04      ,  7.        ],
        [ 3.04      ,  9.        ],
        [ 3.04      , 11.03333333],
        [ 3.04      , 13.        ]]])

您可以使用像 KMeans 这样的聚类算法:

import numpy as np
from sklearn.cluster import KMeans

irregular_points = np.array([[1.1,5.], [0.85,7.1], [0.9,9], [1.1,11], [1.,13.1],
                   [1.9,5.2], [2.,6.9], [1.95,9], [2.1,11.1], [2.,13.1],
                   [3.0,5.1], [3.1,7.0], [3.,9], [3.0,11.], [3.1,12.8]])

kmeans_x = KMeans(n_clusters=3).fit(irregular_points[:, 0, np.newaxis])
kmeans_y = KMeans(n_clusters=5).fit(irregular_points[:, 1, np.newaxis])

clusters_x = kmeans_x.predict(irregular_points[:, 0, np.newaxis])
clusters_y = kmeans_y.predict(irregular_points[:, 1, np.newaxis])

regular_points_x = kmeans_x.cluster_centers_[clusters_x]
regular_points_y = kmeans_y.cluster_centers_[clusters_y]

regular_points = np.asarray([[regular_points_x[i], regular_points_y[i]] for i in range(irregular_points.shape[0])])
>>>
array([[[ 0.99      ,  5.1       ],
        [ 0.99      ,  7.        ],
        [ 0.99      ,  9.        ],
        [ 0.99      , 11.03333333],
        [ 0.99      , 13.        ]],

       [[ 1.99      ,  5.1       ],
        [ 1.99      ,  7.        ],
        [ 1.99      ,  9.        ],
        [ 1.99      , 11.03333333],
        [ 1.99      , 13.        ]],

       [[ 3.04      ,  5.1       ],
        [ 3.04      ,  7.        ],
        [ 3.04      ,  9.        ],
        [ 3.04      , 11.03333333],
        [ 3.04      , 13.        ]]])