Python代码效率

时间:2013-05-17 16:48:27

标签: python matrix

该程序测试矩阵是否是单位矩阵。

我已将代码粘贴在下方,并想知道如何优化此代码的效率。另外我是python编程的新手,是否有一些内置函数可以解决这个问题呢?

    def is_identity_matrix(test):
    if (test == []):
        return False
    i = 0
    while (i < len(test)):
        if (len(test[i]) == len(test)):
            j = 0
            while(j < len(test[i])):
                if (j != i):
                    if(test[i][j] != 0):
                        return False
                else:
                    if(test[i][j] != 1):
                        return False
                if(j == (len(test[i]) - 1)):
                    break
                j += 1
            if(i == (len(test) - 1)):
                break
            i += 1
        else:
            return False
    if(i == j and i == (len(test) - 1)):
        return True

# Test Cases:

matrix1 = [[1,0,0,0],
           [0,1,0,0],
           [0,0,1,0],
           [0,0,0,1]]
print is_identity_matrix(matrix1)
#>>>True

matrix2 = [[1,0,0],
           [0,1,0],
           [0,0,0]]

print is_identity_matrix(matrix2)
#>>>False

matrix3 = [[2,0,0],
           [0,2,0],
           [0,0,2]]

print is_identity_matrix(matrix3)
#>>>False

matrix4 = [[1,0,0,0],
           [0,1,1,0],
           [0,0,0,1]]

print is_identity_matrix(matrix4)
#>>>False

matrix5 = [[1,0,0,0,0,0,0,0,0]]

print is_identity_matrix(matrix5)
#>>>False

matrix6 = [[1,0,0,0],  
           [0,1,0,2],  
           [0,0,1,0],  
           [0,0,0,1]]

print is_identity_matrix(matrix6)
#>>>False

6 个答案:

答案 0 :(得分:13)

def is_identity_matrix(listoflist):
    return all(val == (x == y) 
        for y, row in enumerate(listoflist)  
            for x, val in enumerate(row))

(但是,这不会检查矩阵是否为方形,并且对于空列表返回True)

说明:在all内部,我们有一个带有嵌套循环的生成器表达式,其中val遍历矩阵中的每个值。 x == y评估对角线上的True和其他地方的False。在Python中,True == 1False == 0,您可以比较val == (x == y)。括号很重要: val == x == y将是与val == x and x == y

等效的链式比较

答案 1 :(得分:6)

我会使用numpy

(np.array(matrix1) == np.identity(len(matrix1))).all()

当然,如果您首先将matrix1存储为numpy数组以避免转换,那会更好。

答案 2 :(得分:1)

乘以所有的向量并检查结果是否相同

答案 3 :(得分:1)

检查矩阵的大小,确保它是n x n,然后使用np.identity(n)创建一个实际的单位矩阵,然后将矩阵与您创建的矩阵进行比较。

答案 4 :(得分:1)

def is_identity_matrix(test):
    if not test : return False
    le = len(test[0])
    for i,x in enumerate(test):
        if len(x) == le:
            if any(y!=1 if j==i else y!=0 for j,y in enumerate(x)):
                return False
        else:
            return False
    return True if len(test) == le else False

答案 5 :(得分:0)

如果速度很重要你应该看看Numpy,但是在你不能使用它的情况下,或者将矩阵作为Numpy数组也不值得你也可以使用以下内容:

def is_identity(mat):
    for i, row in enumerate(mat):
        if any(row[:i]) or row[i]!=1 or any(row[i+1:]):
            return False
    return True

比目前接受的答案的代码快约12倍!对于至少2000x2000的矩阵......

以上内容并未检查矩阵尺寸,但您可以轻松添加以下内容:

n = len(matrix)
if not all(len(row) == n for row in matrix):
    return False