检查一个矩阵是否为方阵?(Python)

3

我想测试一个2x2的矩阵[[5,6],[7,8]],看它是否是一个方阵。

我运行了我的代码,本应该得到True,但却得到了False...

 def square(sq):
     for element in sq:
         if element:
             return False
         return True

1
你的代码应该做什么? - Bartlomiej Lewandowski
矩阵何时是方阵? - Hyperboreus
1
一个2x2的矩阵在定义上是方形的,因为行数等于列数。 - Emmet
@AlexThornton 既然测试一个2x2矩阵是否是方阵是完全无意义的(因为2x2根据定义就是方阵),也许OP应该重新考虑是否需要这个功能! - Two-Bit Alchemist
很多混淆正在发生。抱歉。假设(sq)是一个矩阵。我需要返回一个布尔值(True),如果这个矩阵是方阵,或者返回(False)如果它不是。 - user2581724
显示剩余4条评论
5个回答

8

假设m是一个numpy矩阵,并且你已经导入了numpy

def square(m):
    return m.shape[0] == m.shape[1]

肯定函数体应该是 return m.shape[0] == m.shape[1] - kasterma

8
如果你想检查一个矩阵是否为N*N的,你可以使用以下代码:
def isSquare (m): return all (len (row) == len (m) for row in m)

正如你在评论中所说的:如果所有行的长度都等于行数。


肯定更好的做法是把len(m)存储到一个变量中,这样就不必在每次迭代中重新计算它了。 - anon582847382
@AlexThornton 一个列表的 len(m) 真的会在每次调用时计算吗?我认为这个值应该被缓存了。 - Hyperboreus
1
好奇的问题,这样做一个单行函数与lambda函数isSquare = lambda m: all(len(row) == len(m) for row in m)相比有什么好处? - Lily Mara
@NateMara 实际上没有什么,但是那些讨厌lambda的人会批评你。 - Hyperboreus

2
您需要将一个列表的列表作为参数传递。您提供的示例是[[5,6],[7,8]]。
让我们逐步了解您的代码如何处理此输入。
for element in sq:
     if element:
         return False
     return True

我们从for循环开始:

for element in sq:

这段代码循环遍历了列表,第一次迭代时元素是[5,6],下一次则是[7,8]。
接下来你的代码会检查元素是否为True。一个非空列表是True。因此在第一次迭代时,你的代码返回False。
如果输入[[ ], [ ]],你的代码将返回True,表示矩阵是方阵。
要检查矩阵是否为方阵,需要看所有列表的维度是否相同。可以使用类似以下代码实现:
def square(sq):
    rows = len(sq)
    for row in sq:
        if len(row) != rows:
            return False
    return True

0

这个也应该可以工作。

A是一个带矩阵的列表。

if not A:  
    return True  
m = len(A)  
n = len(A[0])  
if m == n:  
    return True  
else:  
    return False

0
如果您的矩阵表示二维空间中的两个坐标,则您的示例是一个正方形。您可以通过测试x和y值的差是否相等来确定这一点。代码可能如下所示:
def square(sq):
    delta_x = sq[1][0] - sq[0][0]
    delta_y = sq[1][1] - sq[0][1]
    return delta_x == delta_y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接