[英]Merging one NumPy array into new NumPy array with equal amount of values
[英]Merging values of numpy array
我有一个多维度的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 diff <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]]])
用布尔值计算一个差异矩阵,布尔值表示对是否可以合并:
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]]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.