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

高维数组使用lexsort进行索引排序的问题求助

高维数组结合lexsort索引的正确实现方式

我一直没法让高维数组配合lexsort的索引正常工作。我有一个形状为(N, 2, 3)的ndarray lines,可以理解为N个三维坐标点对(线段的起点和终点),其中存在需要去除的重复点对。

创建测试数据的代码如下:

import numpy as np

points = np.array([[1,1,0],[-1,1,0],[-1,-1,0],[1,-1,0]])
lines = np.dstack([points, np.roll(points, shift=1, axis=0)])  # 创建点对/线段
lines = np.vstack([lines, lines[..., ::-1]])  # 添加反向的重复点对
lines = lines.transpose(0,2,1)  # 将形状从(N,3,2)转为(N,2,3)

由于点对(v1, v2)与(v2, v1)属于重复项,我用lexsort对每个点对里的两个向量进行排序:

idx = np.lexsort((lines[..., 0], lines[..., 1], lines[..., 2]))

得到的idx形状为(N, 2),代表每个点对沿轴1的排序顺序:

array([[0, 1],
       [0, 1],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 0],
       [0, 1],
       [0, 1]])

但直接使用lines[idx]会得到形状为(N, 2, 2, 3)的结果,尝试过各种newaxis填充、轴重排操作,结果维度反而变得更多;用lines[:, idx]得到的是(N, N, 2, 3),都不符合预期。

查numpy官方文档后,我找到了正确的解决方案:

idx_n = np.arange(len(lines))[:, np.newaxis]
lines[idx_n, idx]

这是因为混合高级索引和简单索引时,lines[:, idx]无法按预期完成广播。但这真的是最简洁的实现方式吗?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:01:55