当前位置: 首页 > 知识库问答 >
问题:

Numpy:沿矩阵对角线构造平方/展开对角矩阵

鲍钊
2023-03-14
index = [1, 2, 3]
counts = [2, 3, 2]
arr = [1, 1, 2, 2, 2, 3, 3]
[
  [1, 1, 0, 0, 0, 0, 0],
  [1, 1, 0, 0, 0, 0, 0],
  [0, 0, 2, 2, 2, 0, 0],
  [0, 0, 2, 2, 2, 0, 0],
  [0, 0, 2, 2, 2, 0, 0],
  [0, 0, 0, 0, 0, 3, 3],
  [0, 0, 0, 0, 0, 3, 3]
]
square = np.zeros((7, 7))
np.fill_diagnol(square, arr) # see arr above
[
  [1, 0, 0, 0, 0, 0, 0],
  [0, 1, 0, 0, 0, 0, 0],
  [0, 0, 2, 0, 0, 0, 0],
  [0, 0, 0, 2, 0, 0, 0],
  [0, 0, 0, 0, 2, 0, 0],
  [0, 0, 0, 0, 0, 3, 0],
  [0, 0, 0, 0, 0, 0, 3]
]
tmp = np.array((arr * N)).reshape((len(arr), len(arr)) 
np.floor( (tmp + tmp.T) / 2 ) # <-- this is closer


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

这得到了我想要的,但可能没有很好地扩展?

riffled = list(zip(index, counts))
riffled
# [(1, 2), (2, 3), (3, 2)]
a = np.zeros((len(arr), len(arr))) # 7, 7 square
last = 0 # <-- keep track of current sub square
for i, c in riffled:
    a[last:last+c, last:last+c] = np.ones((c, c)) * i 
    last += c # <-- shift square

产量

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

共有1个答案

屠和洽
2023-03-14

下面是一个通用的解决方案。

index = [1, 2, 1]
counts = [2, 3, 2]

arr = np.repeat(index, counts)
arr2 = np.repeat(range(len(index)), counts)
np.where(arr2==arr2[:,None], arr, 0)

产出:

array([[1, 1, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1]])
arr = np.array([1, 1, 2, 2, 2, 1, 2])

arr2 = np.cumsum(np.diff(arr,prepend=np.nan)!=0)
np.where(arr2==arr2[:,None], arr, 0)

产出:

array([[1, 1, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 2, 2, 2, 0, 0],
       [0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 2]])
 类似资料:
  • 我正在尝试创建一个类似于这样的numpy数组: 所以这涉及到更新主对角线和它上面的两条对角线。 做这件事的有效方法是什么?

  • 特殊矩阵——三对角矩阵(Tridiagonal Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 三对角矩阵的概念 三对角矩阵就是对角线、邻近对角线的上下次对角线上有元素,其他位置均为0的矩阵。 三对角矩阵是一种特

  • 问题内容: 如何更改numpy中矩阵对角线的值? 我检查了Numpy Modify ndarray对角线 ,但是在numpy v 1.3.0中没有实现该功能。 假设我们有一个np.array X,我想将对角线的所有值设置为0。 问题答案: 你尝试了吗?请参阅以下答案和此讨论。或文档中的以下内容(尽管当前已损坏): http://docs.scipy.org/doc/numpy/reference/

  • 问题内容: 我试图做一个看起来像这样的numpy数组: 因此,这涉及更新主对角线及其上方的两个对角线。 什么是有效的方法? 问题答案: 这是一个Toeplitz矩阵的示例- 您可以使用以下命令构造它:

  • 问题内容: 我在NumPy中有三个相同大小的正方形矩阵。我想将它们组合成块对角矩阵。 例: 做这个的最好方式是什么? 问题答案: scipy.linalg具有block_diag函数以自动执行此操作

  • 问题内容: 我正在尝试执行以下操作 如何使用Numpy数组中的所有元素轻松高效地创建集合? 问题答案: 如果需要一组元素,这是另一种可能更快的方法: PS :之间执行比较后,和一个10x100阵列上,我发现,它们都在大约相同的速度来执行。对于3x3阵列,最快的版本是迭代器版本: 我建议这样做,因为它是内存消耗较少的版本(它随阵列的大小扩展得很好)。 PPS :还有一个NumPy函数可以执行类似的操