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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:05:28