3

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]

A非常に大きな行列になるので、要素を個別に反復処理したくありません。同じ理由で、正しい順序ですべてのインデックスのリストを事前に準備したくありません。が大きく、結果も同じように大きくなるためA、さらに多くのメモリを使用するソリューションは避けたいと思います。

平坦化する対角線のサブセットを指定できれば、さらに良いでしょう。たとえば、1 番目と 2 番目の対角線のみを平坦化すると、 が得られ[1,5,9,2,6]ます。

4

2 に答える 2

0

次の関数はindices、各対角線にインデックス関係があるという事実に基づいた比較に基づいています (たとえば、主対角線i==jなど)。

非二乗 2D 配列に対しても有効です。

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

例:

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.]

非二乗配列の場合:

A=np.array([[1,2,3],
            [7,8,9]])
print flatten_diagonally(A, diags=(1,2))
#[ 1.  8.  2.  9.]
于 2013-08-04T16:09:12.030 に答える