python - 合并 numpy 数组的值

标签 python arrays numpy iteration

我有一个多维 numpy 数组,由四个 x、y 点(point1、point2、point3、point4)表示四个多边形:

     [
      [[248.37320795 107.04369371]
      [628.13542608  93.60279784]
      [631.17731304 179.54898405]
      [251.41509491 192.98987991]]

      [[594.74347239 199.82026651]
      [844.73138802 197.36221057]
      [845.14434142 239.36018039]
      [595.15642579 241.81823634]]

      [[829.86702923 202.4087094 ]
      [984.86439225 201.50457644]
      [985.10355    242.50387892]
      [830.10618698 243.40801188]]

      [[634.70578451 138.71948586]
      [819.6945026  136.67640474]
      [820.27981773 189.67317263]
      [635.29109964 191.71625375]]
      ]

我需要迭代这个数组,并在下面的某些条件下合并它的值。例如:

如果两个多边形的 y 差异 < 20,我应该像这样合并它们:

 [[minX, minY]
 [maxX, minY]
 [maxX, maxY]
 [minX, maxY]]

我必须用这个值重写其中一个多边形并删除第二个。

我尝试迭代它们,但问题是我以某种方式删除了多边形,但我不必这样做。 我是 python 和 numpy 的新手,感觉我做错了什么)这是我得到的:

for i, (i_p1, i_p2, i_p3, i_p4) in enumerate(arr):
    pass
    for j, (j_p1, j_p2, j_p3, j_p4) in enumerate(arr, i + 1):
        # calculate diffs of Y coordinates between polygons
        if j <= len(arr):
            y_diffs = (abs(j_p1[1] - i_p1[1]),
                       abs(j_p2[1] - i_p2[1]),
                       abs(j_p3[1] - i_p3[1]),
                       abs(j_p4[1] - i_p4[1]))

            if y_diffs <= (20, 20, 20, 20):
                # unite polygons
                arr[i] = [
                    [min(i_p1[0], j_p1[0]), min(i_p1[1], j_p1[1])],
                    [max(i_p2[0], j_p2[0]), min(i_p2[1], j_p2[1])],
                    [max(i_p3[0], j_p3[0]), max(i_p3[1], j_p3[1])],
                    [min(i_p4[0], j_p4[0]), max(i_p4[1], j_p4[1])],
                ]

                # delete remaining polygon
                # if j < len(drawPolys):
                #     drawPolys = np.delete(drawPolys, j, axis=0)
                #     break

我想要的结果数据:

[
[[248.37320795 107.04369371]
[628.13542608  93.60279784]
[631.17731304 179.54898405]
[251.41509491 192.98987991]]

[[594.74347239 199.82026651]
[984.86439225 197.36221057]
[985.10355 242.50387892]
[595.15642579 243.40801188]]

[[634.70578451 138.71948586]
[819.6945026  136.67640474]
[820.27981773 189.67317263]
[635.29109964 191.71625375]]
]

最佳答案

初始数据:

p = np.array([
    [[248.37320795, 107.04369371],
     [628.13542608,  93.60279784],
     [631.17731304, 179.54898405],
     [251.41509491, 192.98987991]],
    [[594.74347239, 199.82026651],
     [844.73138802, 197.36221057],
     [845.14434142, 239.36018039],
     [595.15642579, 241.81823634]],
    [[829.86702923, 202.4087094 ],
     [984.86439225, 201.50457644],
     [985.10355   , 242.50387892],
     [830.10618698, 243.40801188]],
    [[634.70578451, 138.71948586],
     [819.6945026 , 136.67640474],
     [820.27981773, 189.67317263],
     [635.29109964, 191.71625375]]])

计算一个差异矩阵,其中 bool 值表示这些对是否可以合并:

a = p[..., 1]
b = a[..., np.newaxis, :]
diff = np.abs(a - b)
dist = np.all(diff < 20, axis=-1)

>>> dist
array([[ True, False, False, False],
       [False,  True,  True, False],
       [False,  True,  True, False],
       [False, False, False,  True]])

让我们去掉对角线条目,只保留矩阵的上半部分:

np.fill_diagonal(dist, False)
dist = np.triu(dist)

>>> dist
array([[False, False, False, False],
       [False, False,  True, False],
       [False, False, False, False],
       [False, False, False, False]])

将其转换为索引:

pairs = np.argwhere(dist)

>>> pairs
array([[1, 2]])

最后,我们将相关对合并在一起:

u = p[pairs]
merged = np.empty((u.shape[0], *u.shape[2:]), dtype=u.dtype)
merged[..., 0, 0] = np.min(u[..., 0, 0], axis=-1)
merged[..., 0, 1] = np.min(u[..., 0, 1], axis=-1)
merged[..., 1, 0] = np.max(u[..., 1, 0], axis=-1)
merged[..., 1, 1] = np.min(u[..., 1, 1], axis=-1)
merged[..., 2, 0] = np.max(u[..., 2, 0], axis=-1)
merged[..., 2, 1] = np.max(u[..., 2, 1], axis=-1)
merged[..., 3, 0] = np.min(u[..., 3, 0], axis=-1)
merged[..., 3, 1] = np.max(u[..., 3, 1], axis=-1)

>>> merged
array([[[594.743, 199.82 ],
        [984.864, 197.362],
        [985.104, 242.504],
        [595.156, 243.408]]])

关于python - 合并 numpy 数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753237/

相关文章:

python - 将两个不同 dtype 的 numpy 数组组合成一个结构化数组

Python 标准输入文件名

python - 使用 julia 的数组或条件评估集

python - 计算数组中非 nan 值的数量

python - 对特征值和特征向量进行排序

javascript - 如何在javascript中收集值?

Python/ NumPy /Scipy : Draw Poisson random values with different lambda

javascript - 如何使 javascript 在 Flask 上与 python 一起工作?

python - IO错误: [Errno 2] No such file or directory shutil

python - numpy 数组的 3D 平铺