查找具有共同元素的矩阵行

问题描述 投票:0回答:2

大家早上好,我是第一次作为 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]].

抱歉,如果我没有提出解决方案并且我的公式不准确,我以前从未使用过此类代码。 谢谢

python matrix find
2个回答
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 中使用数组,这是关键。祝你学习顺利。


0
投票

对于您的问题,一种简单的方法是迭代矩阵的每一列,然后检查该列中是否有任何行具有相同的元素。您可以通过循环遍历每一列来完成此操作,并且对于每一列,循环遍历每一行以检查公共值。跟踪每列的集合或列表中具有公共元素的行。这不需要高级的 python 知识,只需要基本的循环和条件语句。祝你的Python之旅好运!

© www.soinside.com 2019 - 2024. All rights reserved.