Python 如何将方形numpy矩阵重塑为;钻石“;对角线结构的优化最有效

Python 如何将方形numpy矩阵重塑为;钻石“;对角线结构的优化最有效,python,python-3.x,numpy,matrix,Python,Python 3.x,Numpy,Matrix,假设我有一个这样的正方形numpy.matrix [['78' '17' '53' '28'] ['22' '75' '31' '67'] ['15' '94' '03' '80'] ['04' '62' '16' '14']] 出于我的目的,我需要一个像这样的“菱形结构”,所有的对角线都朝上(注意列表列表对于我来说很好) 最好的方法是什么 我无法决定是否需要使用一些位置访问的增量魔法,或者使用numpy.diagonal的内置方式,我还没有成功地使用 import numpy as n

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

[['78' '17' '53' '28']
 ['22' '75' '31' '67']
 ['15' '94' '03' '80']
 ['04' '62' '16' '14']]
出于我的目的,我需要一个像这样的“菱形结构”,所有的对角线都朝上(注意列表列表对于我来说很好)

最好的方法是什么

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

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矩阵,它的工作速度也非常快

这不再是NxN数组/矩阵,除非您屏蔽了其他值,或者您实际上只需要该形式的列表。你为什么需要这个?你能重新安排你的索引来模仿它吗?是的,我知道它不再是一个方阵/数组,一个列表列表就可以了。我需要这些对角线来进行一些类似列表的操作,这些操作取决于每个对角线的长度,这是我事先不知道的(不是简单的4x4情况,更像~1000x~1000情况)。循环很容易,我渴望看到一个矢量化/整洁的解决方案。@timgeb同意,是的,印度循环和已知的矩阵大小非常简单,只是有点乏味。似乎一定有更好的解决方案。请使用
range
而不是
xrange
,因为问题是针对python3的,否则:答案很好!
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])]