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

求基于Numpy的Mesh数组双向高效重组算法(解决排序问题)

高效Numpy实现Nx3x3向量数组到顶点+索引的转换

问题背景

需要将形状为(N,3,3)的vectors数组转换为:

  • vertices:包含所有唯一点的(M,3)数组,保持点首次出现的顺序
  • indices:用于重建原vectors的(N,3)数组

现有实现存在两个核心问题:

  1. numpy.unique默认会对顶点排序,打乱原始出现顺序
  2. 双重循环匹配索引效率极低,无法处理大规模数据

高效解决方案

利用numpy.unique的return_index和return_inverse参数,结合索引映射实现无循环的高效转换,同时保留顶点首次出现的顺序:

import numpy as np

def vectors_to_vertices(vectors):
    # 将Nx3x3的数组展平为(N*3, 3)的二维数组
    v_flat = vectors.reshape(-1, 3)
    
    # 获取排序后的唯一顶点、首次出现索引、原数组元素在排序后唯一数组中的索引
    _, idx_sorted, inv_sorted = np.unique(v_flat, axis=0, return_index=True, return_inverse=True)
    
    # 对首次出现索引排序,得到顶点的原始出现顺序
    idx_order = np.argsort(idx_sorted)
    # 按原始顺序提取顶点
    vertices = v_flat[idx_sorted[idx_order]]
    
    # 创建排序后索引到原始顺序索引的映射
    map_inv = np.zeros_like(idx_order)
    map_inv[idx_order] = np.arange(len(idx_order))
    # 将原逆索引转换为对应原始顺序顶点的索引,再重塑为Nx3
    indices = map_inv[inv_sorted].reshape(-1, 3)
    
    return vertices, indices

代码解释

  1. 数组展平:将Nx3x3的vectors转换为N*3个3维点的二维数组,简化后续唯一值处理逻辑
  2. 提取唯一信息:np.unique返回的idx_sorted是排序后唯一顶点在原展平数组中的首次出现位置,inv_sorted是原展平数组每个元素对应排序后唯一顶点的索引
  3. 恢复原始顺序:通过np.argsort(idx_sorted)得到排序后的索引对应的原始顺序,从而提取出按首次出现顺序排列的vertices
  4. 索引映射:创建map_inv数组完成排序索引到原始顺序索引的映射,再通过inv_sorted快速生成最终的indices,完全避免低效循环

双向转换验证

反向转换(从vertices和indices重建vectors)可直接通过索引取值实现:

def vertices_to_vectors(vertices, indices):
    return vertices[indices].reshape(-1, 3, 3)

示例测试

用你提供的示例输入验证:

# 构造示例vectors数组
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
d = np.array([10,11,12])
e = np.array([13,14,15])

vectors = np.array([
    [a, b, c],
    [c, d, a],
    [b, d, e]
])

vertices, indices = vectors_to_vectors(vectors)
print("Vertices:\n", vertices)
print("Indices:\n", indices)
# 输出符合预期:顶点按a、b、c、d、e顺序排列,索引匹配需求

# 反向转换验证
reconstructed = vertices_to_vectors(vertices, indices)
assert np.array_equal(reconstructed, vectors)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:35:14