首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法可以有效地以对角线顺序展平numpy数组?

有没有一种方法可以有效地以对角线顺序展平numpy数组?
EN

Stack Overflow用户
提问于 2013-06-01 05:37:00
回答 2查看 1.1K关注 0票数 3

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

代码语言:javascript
运行
复制
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]

A将是一个非常大的矩阵,所以我不想逐个迭代元素。出于同样的原因,我也不想提前准备所有索引的正确顺序的列表。由于A很大,结果也同样很大,因此我希望避免使用额外占用大量内存的解决方案。

如果我能指定我想展平对角线的哪个子集,那就更好了,例如,只展平第一条和第二条对角线就可以得到[1,5,9,2,6]

EN

回答 2

Stack Overflow用户

发布于 2013-06-01 05:42:00

numpy.diag返回沿某个索引的对角线。Documentation

因此,这将为您提供所需的输出:(请注意,第0条对角线是正常对角线,因此如果您需要子对角线,则可能需要对角线使用负值。)

代码语言:javascript
运行
复制
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.diagonal,而不是np.diag,我不太确定哪个更好。Documentation

票数 0
EN

Stack Overflow用户

发布于 2013-08-05 00:09:12

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

即使对于非平方的2D阵列,它也是有效的。

代码语言:javascript
运行
复制
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

示例:

代码语言:javascript
运行
复制
print flatten_diagonally(A)
#[ 7.  4.  8.  1.  5.  9.  2.  6.  3.]

print flatten_diagonally(A, diags=(1,2))
#[ 4.  8.  1.  5.  9.]

对于非平方数组:

代码语言:javascript
运行
复制
A=np.array([[1,2,3],
            [7,8,9]])
print flatten_diagonally(A, diags=(1,2))
#[ 1.  8.  2.  9.]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16866395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档