【问题标题】:Diagonal matrix of consecutive numbers连续数的对角矩阵
【发布时间】:2016-03-09 13:56:32
【问题描述】:

我想在 python 2.7 的代码下面创建一个对角矩阵

def diag(steps):
    '''
    steps : a positive integer
    '''
    matrix = [[0]*steps]*steps    # matrix of the order step x step
    for i in range(steps + 1):
        matrix[i][i] = i + 1    # i'th' element of 'i'th row
    return matrix

例如:如果 step = 3,我应该得到 [ [1, 0, 0], [0, 2, 0], [0, 0, 3] ]。 但我得到 [ [1, 2, 3], [1, 2, 3], [1, 2, 3] ] 谁能帮我解决这个错误,请告诉我我的逻辑有什么问题?

【问题讨论】:

标签: python-2.7 matrix canopy


【解决方案1】:

通过将数组相乘,您不会创建包含三个不同数组的矩阵。您创建对同一数组的多个引用。

例子:

> a = [2,2,2]
> b = [a]*3
> print b
[[2, 2, 2], [2, 2, 2], [2, 2, 2]]
> a[1] = 4
> print b
[[2, 4, 2], [2, 4, 2], [2, 4, 2]]
> b[0][0] = 8
> print b 
[[8, 4, 2], [8, 4, 2], [8, 4, 2]]

你看到了吗?现在每个 3 数组中的每个第一个元素都是 8,而不仅仅是 b[0][0]。那是因为它们都是同一个对象。

你必须改变

matrix = [[0]*steps]*steps 

# probably not the best pythonic way but it works
matrix = [[0 for x in range(steps)] for x in range(steps)]

【讨论】:

    【解决方案2】:

    1) 为方便起见,您可以考虑使用numpy,它允许以更“数学”的方式工作,而不是 python 的列表。 在您的情况下,您可能想查看numpy.diag(vector) 创建一个len(vector)xlen(vector) 矩阵,其中matrix[i][i] = vector[i]

    根据您的需要,您可以使用 numpy:

    import numpy as np
    matrix = np.diag( list(range(1, steps+1))
    

    仅此而已

    2)要回答您的确切问题(以防由于某种原因您不能使用 numpy),您可以简短地说:

    def diag(steps):
        matrix = [ [0]*i+[i+1]+[0]*(steps-i-1) for i in range(steps) ]
        return matrix
    

    【讨论】:

    • 当然,在我获得 15 个声望之后,我最终会的。在那之前我不能投票。对不起
    • 验证问题对于下一个到达这里的用户来说更为重要:)
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多