如何生成表示矩阵中每一对行对应位置元素是否均为1的张量,或直接生成简化后的矩阵?
嘿,这问题我熟!咱们分两步来,先搞定中间的三维张量,再给你说怎么直接跳转到最终的简化矩阵——后者其实更高效,尤其矩阵规模大的时候。
生成中间三维张量
你需要的是一个三维张量,其中每个[i][j]位置的向量,对应原矩阵第i行和第j行逐元素的"均为1"判断结果。用Python的话,不管是纯原生实现还是借助numpy都能轻松搞定:
纯Python实现
# 输入矩阵 A = [[1, 0, 1], [0, 1, 1], [0, 0, 0]] # 生成三维张量 tensor = [] for row_i in A: row_pairs = [] for row_j in A: # 逐元素判断:都为1则记1,否则0 pair_vec = [1 if a == 1 and b == 1 else 0 for a, b in zip(row_i, row_j)] row_pairs.append(pair_vec) tensor.append(row_pairs) print(tensor)
运行后输出就是你要的结果:
[[[1, 0, 1], [0, 0, 1], [0, 0, 0]], [[0, 0, 1], [0, 1, 1], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
numpy高效实现(推荐)
利用numpy的广播机制,一行代码就能生成张量,速度快得多:
import numpy as np A = np.array([[1, 0, 1], [0, 1, 1], [0, 0, 0]]) # 扩展维度后做元素级逻辑与运算,再转成整数类型 tensor = (A[:, None, :] & A[None, :, :]).astype(int) print(tensor)
直接得到简化矩阵
如果你的最终目标只是判断每对行是否存在任意一个同时为1的位置,完全不需要生成中间张量,用矩阵点积或者逐行判断就能直接得到结果:
numpy高效实现(最推荐)
二进制矩阵和它的转置做乘法,结果的每个元素[i][j]是第i行和第j行同时为1的位置数量,只要数量>0就记为1:
import numpy as np A = np.array([[1, 0, 1], [0, 1, 1], [0, 0, 0]]) # 点积后判断是否大于0,转成整数 simplified_matrix = (A @ A.T > 0).astype(int) print(simplified_matrix)
输出正好是你要的简化矩阵:
[[1 1 0] [1 1 0] [0 0 0]]
纯Python实现
如果不想用numpy,纯原生代码也能直接生成:
A = [[1, 0, 1], [0, 1, 1], [0, 0, 0]] row_count = len(A) simplified_matrix = [[0]*row_count for _ in range(row_count)] for i in range(row_count): for j in range(row_count): # 检查是否存在任意位置同时为1 has_common_one = any(a == 1 and b == 1 for a, b in zip(A[i], A[j])) simplified_matrix[i][j] = 1 if has_common_one else 0 print(simplified_matrix)
内容的提问来源于stack exchange,提问作者TheSneak
相关产品推荐
相关产品推荐

