首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python代码效率

Python代码效率
EN

Stack Overflow用户
提问于 2013-05-18 00:48:27
回答 6查看 733关注 0票数 2

这个程序测试一个矩阵是否是单位矩阵。

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

代码语言:javascript
复制
    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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-18 01:00:50

代码语言:javascript
复制
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等效的链式比较

票数 13
EN

Stack Overflow用户

发布于 2013-05-18 00:55:01

我会使用numpy

代码语言:javascript
复制
(np.array(matrix1) == np.identity(len(matrix1))).all()

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

票数 6
EN

Stack Overflow用户

发布于 2013-05-18 00:55:13

乘以全一向量,并检查结果是否相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16614198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档