连续数字的对角矩阵

时间:2016-03-09 13:56:33

标签: python-2.7 matrix canopy

我想在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]] 任何人都可以帮我解决这个错误,请告诉我的逻辑有什么问题吗?

2 个答案:

答案 0 :(得分:1)

通过乘以数组,您不会创建具有三个不同数组的矩阵。您创建对同一数组的多个引用。

示例:

struct ItemExist: public std::binary_function< Item*, int, bool > {
  bool operator () ( const Item *sc, const int &number ) const {
    return sc->orderNumber== number;
    }
  };
你知道吗?每个3阵列中的每个第一个元素现在都是8,而不仅仅是b [0] [0]。那是因为它们都是同一个对象。

你必须改变

> 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]]

matrix = [[0]*steps]*steps 

答案 1 :(得分:0)

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