【问题标题】:How to reshape square numpy matrix into "diamond" of diagonals structure most efficiently如何最有效地将方形numpy矩阵重塑为对角线结构的“钻石”
【发布时间】:2016-05-23 11:40:51
【问题描述】:

假设我有一个像这样的正方形numpy.matrix

[['78' '17' '53' '28']
 ['22' '75' '31' '67']
 ['15' '94' '03' '80']
 ['04' '62' '16' '14']]

出于我的目的,我需要一个向上的所有对角线的“菱形结构”(请注意,列表列表适合我的目的)

 [       ['78'], 
      ['22' '17'],
    ['15' '75' '53'],
  ['04' '94' '31' '28'],
    ['62' '03'  '67'],
       ['16' '80'],
         ['14'],      ]

最好的方法是什么?

我无法决定是否需要在位置访问中使用一些递增的魔法,或者使用numpy.diagonal 的一些内置方式是可能的,我还没有成功使用。

【问题讨论】:

  • 这不再是一个 NxN 数组/矩阵,除非你屏蔽了其他值,或者你实际上只是想要一个该形式的列表列表。你为什么需要这个?你可以重新排列你的索引来模仿它吗?
  • 是的,我知道它将不再是方阵/数组,列表列表可以正常工作。我需要这些对角线进行一些类似列表的操作,这些操作取决于每个对角线的长度,我事先不知道(不是简单的 4x4 案例,更像是 ~1000x~1000 案例)
  • 循环很容易,我渴望看到一个矢量化/简洁的解决方案。
  • @timgeb 同意,是的,索引循环和已知矩阵大小非常简单,只是有点乏味。似乎必须有更好的解决方案。

标签: python python-3.x numpy matrix


【解决方案1】:
import numpy as np

a=np.array([[78, 17, 53, 28],
    [22, 75, 31, 67],
    [15, 94, 03, 80],
    [04, 62, 16, 14]])

[np.diag(a[-1:-a.shape[0]-1:-1,:], i).tolist() for i in range(-a.shape[0]+1,a.shape[0])]

输出 [[78], [22, 17], [15, 75, 53], [4, 94, 31, 28], [62, 3, 67], [16, 80], [14] ] 根据要求

它对 1000x1000 矩阵也非常有效

【讨论】:

  • 使用range而不是xrange,因为问题是针对python3的,否则:很好的答案!
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 2014-02-07
  • 2021-10-05
  • 1970-01-01
  • 2018-04-29
  • 2021-09-14
  • 2016-07-15
  • 1970-01-01
相关资源
最近更新 更多