在NumPy数组中查找元素并记录位置——3D模型面邻接矩阵分析
没问题,这个需求用NumPy的矩阵操作就能轻松实现,我给你一步步拆解怎么做:
核心思路
你提到的左下三角区域对应数组中行索引大于列索引的位置(排除对角线,因为对角线是面自己和自己,不存在邻接关系),我们只需要定位这些位置,统计其中值为1的数量,同时记录它们的坐标即可。
代码实现
先给你一个完整的示例,假设我们有这样一个邻接矩阵(用0索引对应你的1-based面编号,后面会说怎么转换回去):
import numpy as np # 示例邻接矩阵:(1,0)和(2,0)是凹连接,右上三角是凸连接 adj_matrix = np.array([ [0, 1, 1], [1, 0, 1], [1, 0, 0] ]) # 1. 获取左下三角(i > j,排除对角线)的所有索引 row_idx, col_idx = np.tril_indices(adj_matrix.shape[0], k=-1) # 2. 提取这些位置的元素,统计凹连接数量 concave_count = np.sum(adj_matrix[row_idx, col_idx] == 1) # 3. 记录凹连接的位置(如果你的面是1-based编号,就给索引加1) # 转换为1-based的面编号对,比如(2,1)表示面2和面1的凹连接 concave_positions = list(zip(row_idx + 1, col_idx + 1)) # 输出结果 print(f"凹连接总数:{concave_count}") print(f"凹连接的面对(1-based):{concave_positions}")
代码解释
np.tril_indices(n, k=-1):这个函数会返回n阶矩阵中所有满足行索引 > 列索引的位置,正好对应你说的左下三角区域(k=-1表示排除对角线,避免统计面自己和自己的无效连接)。- 统计数量:我们直接提取这些位置的元素,求和等于1的个数,就是凹连接的总数。
- 位置转换:如果你的面编号是从1开始的,只需要给索引加1,就能得到和你描述一致的“面1、面2”这样的编号对。
注意事项
- 确保你的输入是二维NumPy数组,如果是普通列表的列表,先通过
np.array()转换。 - 如果矩阵中存在非0/1的数值,记得调整判断条件(比如只统计等于1的元素)。
内容的提问来源于stack exchange,提问作者haagn
相关产品推荐
相关产品推荐

