高维数组使用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
相关产品推荐
相关产品推荐

