大家早上好,我是第一次作为 Python 初学者来到这里。 我必须解决以下问题:给定一个如下所示的矩阵,我需要找到哪些行在同一位置有一些共同的非零元素(在这种情况下,第 0 行和第 1 行有第一个共同元素)。我已经找到了相等的行。
A = [[1 1 0 0 0 0],
[1 0 0 0 0 0],
[0 0 1 0 0 0],
[0 0 0 1 1 1],
[0 0 0 1 1 1]].
抱歉,如果我没有提出解决方案并且我的公式不准确,我以前从未使用过此类代码。 谢谢
确切的解决方案取决于您想要如何呈现结果。这将是我的方法,产生关联元素的配对元组列表。
首先,我考虑将列表列表转换为 numpy 数组,这是用于数组计算和线性代数的主要 Python 库。这将使我们能够像操纵矩阵一样操纵该对象。
import numpy as np
A = [[1,1,0,0,0,0],
[1,0,0,0,0,0],
[0,0,1,0,0,0],
[0,0,0,1,1,1],
[0,0,0,1,1,1]]
A = np.array(A)
接下来需要一些解决问题的技巧。可以注意到,如果标量积为 0,则两个向量没有公共 1;相反,如果标量积 >0,则它们有公共 1。例如:
[1,1,0,0,0,0]x[1,0,0,0,0,0] = 1x1+1x0+0x0+0x0+0x0+0x0 = 1
[1,1,0,0,0,0]x[0,0,1,0,0,0] = 1x0+1x0+0x1+0x0+0x0+0x0 = 0
我们现在可以搜索具有两个嵌套循环的行,以测试每个循环的标量积是否 > 0。但是,有一种更简洁的方法可以一次性完成此操作。请注意,将矩阵与其转置相乘 Ax(A^t) = M 会生成一个矩阵,其元素 Mij 是 vi * vj 的标量积。这意味着我们可以通过执行此乘法一次性获得所有标量积,这可以通过使用 numpy 的 matmul 函数和“.T”语法来获得转置来完成。
M = np.matmul(A, A.T)
M
>> array([[2, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 3, 3],
[0, 0, 0, 3, 3]])
现在唯一剩下的就是获取索引 (i,j),其中 Mij > 0 且不重复,因为 Mij = vi x vj = vj x vi = Mji。要获取满足条件的索引,numpy 有 where 函数,可以直接执行此操作,您可以这样使用:
rows, columns = np.where(M > 0)
rows, columns
>> (array([0, 0, 1, 1, 2, 3, 3, 4, 4], dtype=int64),
array([0, 1, 0, 1, 2, 3, 4, 3, 4], dtype=int64))
这已经可以作为答案了。然而,我们仍然有重复,因为我们在列表中表示了 (1,0) 和 (0,1),我们希望以更友好的方式呈现它。因此,我们通过应用列表理解将所有这些合并在一起来完成。
result = [(row, column) for row, column in zip(rows, columns) if row < column]
result
>> [(0, 1), (3, 4)]
我鼓励您了解有关 numpy 库的更多信息,如果您想在 Python 中使用数组,这是关键。祝你学习顺利。
对于您的问题,一种简单的方法是迭代矩阵的每一列,然后检查该列中是否有任何行具有相同的元素。您可以通过循环遍历每一列来完成此操作,并且对于每一列,循环遍历每一行以检查公共值。跟踪每列的集合或列表中具有公共元素的行。这不需要高级的 python 知识,只需要基本的循环和条件语句。祝你的Python之旅好运!