【问题标题】:define a function that returns a nxn square matrix定义一个返回 nxn 方阵的函数
【发布时间】:2017-08-08 12:49:32
【问题描述】:

我刚学python,想定义一个返回nxn方阵的函数,主对角线(i=j)、上对角线(j=i+1)和下对角线(j=i)的预定义值-1) 和所有其他元素都等于 0。

任何帮助将不胜感激,

谢谢


import numpy as np 
import scipy as sp 
n=6 
m=np.zeros((n,n)) 
for i in range(n): 
    m[i-1,i]=-1 
    m[i,i]=2 
    m[i,i-1]=1 
    m[0,n-1]=0 
    m[n-1,0]=0 
print m

【问题讨论】:

  • 贴出你试过的代码。
  • import numpy as np import scipy as sp n=6 m=np.zeros((n,n)) for i in range(n): m[i-1,i]=-1 m[i,i]=2 m[i,i-1]=1 m[0,n-1]=0 m[n-1,0]=0 打印 m
  • 我将您的代码移到了问题中。它在那里的格式更好。
  • scipy.sparse 有几种方法可以同时设置多个对角线。 numpy.diag 一次设置一个对角线,但其他方面很容易使用。

标签: python-2.7 numpy scipy


【解决方案1】:

如果a,b,c分别是你的上对角线、主对角线和下对角线的三个列表,你可以这样写:

import numpy as np
a=[1,2,3,4]
b=[5,6,7,8,9]
c=[10,11,12,13]
n=len(b)
m=np.zeros((n,n))
for i in range(0,n-1):
    m[i,i+1]=a[i]
    m[i,i]=b[i]
    m[i+1,i]=c[i]
m[n-1,n-1]=b[n-1]
print(m)

在上面的代码中,您初始化了一个零矩阵,然后根据您的列表仅更新上、下和主对角线条目。 输出是

[[  5.   1.   0.   0.   0.]
 [ 10.   6.   2.   0.   0.]
 [  0.  11.   7.   3.   0.]
 [  0.   0.  12.   8.   4.]
 [  0.   0.   0.  13.   9.]]

编辑:@hpaulj 建议的更短的方法是

m=np.diag(a,1)+np.diag(b,0)+np.diag(c,-1)

np.diag(r,k) 创建一个矩阵,其中主对角线上方的k'th 对角线(如果k 为负数则在下方)为r,其余条目为0。

在此处查看文档: https://docs.scipy.org/doc/numpy/reference/generated/numpy.diag.html

【讨论】:

  • np.diag(a,1)+np.diag(b,0)+np.diag(c,-1)一起玩
  • @hpaulj 不错的把戏.. 但是,我想这只有在非对角元素为零时才能正常工作
【解决方案2】:

这是一种方法,它接收要添加到对角线上的项目列表,使用numpy.diag 并利用k 参数来指定我们要修改的对角线。

import numpy as np

def create_diag(n, l):
    arr = np.zeros((n, n))

    # check that l contains an odd number of elements
    if len(l) % 2 != 1:
        return arr

    # check that we have at most the number of diagonals in the matrix
    if len(l) >= 2*n:
        return arr

    # set limits of diagonals to set. setting 3 diagonals means limits=[-1,0,1]. setting 1 diagonal means limits=[0]
    limit = int((len(l) - 1) / 2)
    limits = range(-limit, limit + 1)

    # maps k-->list of values on the diagonal
    diag_map = dict(zip(limits, l))
    for k, v in diag_map.items():
        diag = [v] * (n - abs(k))
        arr += np.diag(diag, k=k)
    return arr

# elements to put on the diagonal, centered about the main diagonal (i=j)
l = [-1,1,2]
n = 6

diag_arr = create_diag(n, l)

# [[ 1.  2.  0.  0.  0.  0.]
#  [-1.  1.  2.  0.  0.  0.]
#  [ 0. -1.  1.  2.  0.  0.]
#  [ 0.  0. -1.  1.  2.  0.]
#  [ 0.  0.  0. -1.  1.  2.]
#  [ 0.  0.  0.  0. -1.  1.]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多