有没有一种方法可以有效地按对角线顺序展平一个纽比阵列?

2024-04-24 10:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种有效的方法(最好是一个矢量化的快速内置函数)以对角线顺序展平一个numpy数组。例如:

A=np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])
b=flatten_diagonally(A)

b应该是[7,4,8,1,5,9,2,6,3]。在

{cde>不要单独迭代矩阵。出于同样的原因,我也不想预先准备一份按正确顺序列出的所有指数。由于A很大,结果也同样大,所以我希望避免另外使用大量内存的解决方案。在

如果我可以指定要展平的对角线的子集,那会更好,例如,仅展平第一条和第二条对角线将得到[1,5,9,2,6]。在


Tags: 方法函数numpy顺序np原因矩阵数组
2条回答

下面的函数基于indices比较,基于每个对角线都有一个索引关系的事实,例如在主对角线i==j,依此类推。。。在

对于非平方数组有效。在

def flatten_diagonally(x, diags=None):
    diags = np.array(diags)
    if x.shape[1] > x.shape[0]:
        diags += x.shape[1]-x.shape[0]
    n = max(x.shape)
    ndiags = 2*n-1
    i,j = np.indices(x.shape)
    d = np.array([])
    for ndi in range(ndiags):
        if diags != None:
            if not ndi in diags:
                continue
        d = np.concatenate((d,x[i==j+(n-1)-ndi]))
    return d

示例:

^{pr2}$

对于非平方数组:

A=np.array([[1,2,3],
            [7,8,9]])
print flatten_diagonally(A, diags=(1,2))
#[ 1.  8.  2.  9.]

在数字诊断返回沿某个索引的对角线。Documentation

所以这应该会给你想要的输出:(注意第0条对角线是正常对角线,所以如果你想要子对角线,你可能需要对对角线使用负值。)

import numpy as np

def flatten_diagonally(npA, diagonals = None):
    diagonals = diagonals or xrange(-npA.shape[0] + 1, npA.shape[1])
    return np.concatenate(map(lambda x: np.diag(npA, k = x), diagonals))

请注意,而不是np诊断,您可以使用np.对角线,我不太确定哪个更好。Documentation

相关问题 更多 >