【问题标题】:Block diagonal matrix with offsets Python带有偏移Python的块对角矩阵
【发布时间】:2019-04-26 21:41:38
【问题描述】:

Numpy 提供了一种使用偏移量从单个元素创建对角矩阵的方法。现在,我有一个 2*2 块的列表,而不是单个元素,可以沿着具有指定偏移量的对角线插入。 下面是 11 个 2*2 数组块,它们应该适合 24*24 矩阵的 +1 偏移量。我知道 scipy.linalg.block_diag 可以为(隐式)零偏移创建块对角线。

一般来说,我有一个 2*2 块数组的列表,我想沿着 2*2 块对角线的指定偏移量插入这些块

[array([[ 1,  8],[ 5, 40]]), array([[ 2,  7],[10, 35]]), array([[0, 0],        [0, 0]]), array([[ 3, 6],[15, 30]]), array([[ 4, 5],[20, 25]]),array([[0, 0],[0, 0]]), array([[ 5, 4],[25, 20]]), array([[ 6, 3],[30, 15]]), array([[0, 0],[0, 0]]), array([[ 7, 2],[35, 10]]), array([[ 8, 1], [40, 5]])]

【问题讨论】:

  • 所有block_diag 所做的只是遍历块并插入到正确的切片中,out[r:r + rr, c:c + cc] = arrs[i]。这里没有神奇的编译代码。只是简单的迭代和索引。

标签: numpy


【解决方案1】:

你可以让block_diag通过预先和附加一个宽度/高度为零的数组来创建一个偏移量:

from scipy import linalg

blocks = np.multiply.outer(np.arange(1,4), np.ones((2,2), int))
offset = 3
aux = np.empty((0, offset), int)

linalg.block_diag(aux.T, *blocks, aux)
# array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 2, 2, 0, 0, 0, 0, 0],
#        [0, 0, 2, 2, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 3, 3, 0, 0, 0],
#        [0, 0, 0, 0, 3, 3, 0, 0, 0]])
linalg.block_diag(aux, *blocks, aux.T)
# array([[0, 0, 0, 1, 1, 0, 0, 0, 0],
#        [0, 0, 0, 1, 1, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 2, 2, 0, 0],
#        [0, 0, 0, 0, 0, 2, 2, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 3, 3],
#        [0, 0, 0, 0, 0, 0, 0, 3, 3],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0]])

【讨论】:

  • 谢谢你,但这里的偏移量会在主对角线下方插入块。我宁愿在主对角线上方有正偏移,在主对角线下方有负偏移
  • @Sommy 请再看一遍。块是否低于或高于只是交换auxaux.T的问题。
猜你喜欢
  • 2015-05-21
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多