You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多边形文本数据转换为[num_boxes,4,2]形状的NumPy数组?

将多边形坐标转换为规范边界框数组的NumPy实现

我有一个文本文件,每行以x1,y1,x2,y2,x3,y3,x4,y4的格式定义一个多边形,数据行重复排列。希望将这些数据读入NumPy数组,最终形状为[num_boxes,4,2],其中每个框的结构是[[x_min,y_min],[x_min,y_max],[x_max,y_max],[x_max,y_min]](x_min/x_max为该多边形所有x坐标的最小/最大值,y_min/y_max同理)。

我已经通过以下代码读取数据并计算出极值:

boxes_x = np.loadtxt(label_path,usecols=np.arange(0,8,2),dtype=int,delimiter=",")
boxes_y = np.loadtxt(label_path,usecols=np.arange(1,8,2),dtype=int,delimiter=",")

x_max = boxes_x[:].max(axis=1)
y_max = boxes_y[:].max(axis=1)
x_min = boxes_x[:].min(axis=1)
y_min = boxes_y[:].min(axis=1)

但不知道如何将这些极值数据重塑为目标形状[num_boxes,4,2],求最佳实现方式。


解决方案

基于你已经算出的极值数组,最直接的方式是构造每个边界框的四个顶点,再组合成目标形状:

方法1:基于现有极值数组构造

# 将一维的极值数组组合成二维的顶点坐标(每个顶点是[x,y])
top_left = np.stack([x_min, y_min], axis=1)    # 形状:[num_boxes, 2]
top_right = np.stack([x_min, y_max], axis=1)
bottom_right = np.stack([x_max, y_max], axis=1)
bottom_left = np.stack([x_max, y_min], axis=1)

# 将四个顶点沿第1维度堆叠,得到目标形状[num_boxes,4,2]
boxes = np.stack([top_left, top_right, bottom_right, bottom_left], axis=1)

方法2:优化读取流程(更高效)

可以一次性读取所有坐标,避免两次调用np.loadtxt,再统一计算极值:

# 一次性读取所有行,形状为[num_boxes, 8]
all_coords = np.loadtxt(label_path, dtype=int, delimiter=",")
# 重塑为每个多边形的四个点坐标,形状[num_boxes,4,2]
points = all_coords.reshape(-1, 4, 2)

# 计算每个多边形的x/y极值(axis=1表示在四个点的维度上取最值)
x_min = points[..., 0].min(axis=1)
x_max = points[..., 0].max(axis=1)
y_min = points[..., 1].min(axis=1)
y_max = points[..., 1].max(axis=1)

# 同样构造目标数组
boxes = np.stack([
    np.stack([x_min, y_min], axis=1),
    np.stack([x_min, y_max], axis=1),
    np.stack([x_max, y_max], axis=1),
    np.stack([x_max, y_min], axis=1)
], axis=1)

说明

  • np.stack(axis=1)会将两个一维数组(如x_min和y_min)按列组合成二维的顶点数组;
  • 最后一次np.stack(axis=1)会将四个顶点数组沿第1维度堆叠,正好得到[num_boxes,4,2]的目标形状,每个元素对应一个边界框的四个顶点。

内容的提问来源于stack exchange,提问作者abinitio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:58:21