【问题标题】:In matrix of 100 x 100 in python, filling the off diagonal elements在 python 中的 100 x 100 矩阵中,填充非对角线元素
【发布时间】:2014-01-06 05:38:31
【问题描述】:

我正在尝试在 100x100 矩阵上填充非对角线元素,如下图 matlab 代码所示,那么如何在 python 中复制它。

T=(2*t0*diag(ones(1,100)))-(t0*diag(ones(1,99),1))-(t0*diag(ones(1,99),-1))

所以我知道 RHS 的第一项将用值 2*t0 填充矩阵的对角线,

我在python中做的如下:

x = np.zeros((100,100))
np.fill_diagonal(x,2*t0)

但我不知道如何处理第二项和第三项,我知道它们将填充对角线元素上方和下方的值,值为-t0,而不是所有非对角线值,而仅填充-t0对角线的上下值,其余都是零,但是我不知道如何为它编写python代码。

我找到了这段代码:

# diagonal with offset from the main diagonal
diag([1,2,3], k=1) 

将输出为:

array([[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3],
[0, 0, 0, 0]])

但是如何将它应用于大型矩阵,就像我的问题一样? 我在交互式 python 中工作,即 Anaconda,那么我可以使用哪些其他软件包来解决我的问题?

【问题讨论】:

  • 在未来 (numpy version 1.10),您将能够通过 numpy.diagonal 轻松地做到这一点。不幸的是,未来还没有到来......
  • 现在是here

标签: python matlab numpy matrix


【解决方案1】:

根据您在此处提供的np.diag,很容易做到:

a = np.ones((1, 100))[0]
b = np.ones((1, 99))[0]
m = np.diag(a, 0) + np.diag(b, -1) + np.diag(b, 1)

m 这里是 100x100 三对角矩阵

更新:

我找到了一个类似问题的链接here,你也看看。

【讨论】:

  • @user3048426 不客气。如果这正是您正在寻找的,请考虑接受我的回答。 :)
【解决方案2】:

试试 np.triu()np.tril()

numpy.tril(m, k=0)

  Lower triangle of an array.
  Return a copy of an array with elements above the k-th diagonal zeroed.
  Parameters: m - array_like, shape (M, N), input array; k - int, optional

  Diagonal above which to zero elements. k = 0 (the default) is the main diagonal, k < 0 is below it and k > 0 is above.


 numpy.triu(m, k=0)

 Upper triangle of an array.
 Return a copy of a matrix with the elements below the k-th diagonal zeroed.

3x3 矩阵示例:

a=np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
print(a)
>>> array([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])

a_diag=np.tril(np.triu(a, k=0), k=0)
print (a_diag)

>>> array([[1, 0, 0],
          [0, 5, 0],
          [0, 0, 9]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多