2016-09-06 16 views
2

N * N行列を考えてみましょう。私は任意の要素を選択し、numpyを使ってそれを通過する対角線と対角線の合計を求めます。例えば対角線と対角線の合計をnumpyを使用して2D N * N行列にします。

:それが返すべき番号8(2 + 8 + 14)+(4 + 8 + 12 + 16 + 20)について

>>> a = np.array([[0, 1, 2, 3, 4], 
        [5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19], 
        [20, 21, 22, 23, 24]]) 

ありがとうございました。

+0

2,8,14はどのように行列の対角になりますか? 編集:ああ、私は今ポイントを参照してください。あなたが選んだ数字は、2つの対角線が交差する中心になるでしょう – offeltoffel

+0

それを説明するのは申し訳ありませんが、私は要素を選択し、それを通過する対角と対角線を取得します – darekarsam

答えて

2

np.diagを使用してください。要素a[i, j]を選択したとします。 j-iは対角エントリ(i, i)上記列の数であるため、その後、

>>> diagonal = np.diag(a, j-i) 
>>> antidiagonal = np.diag(a[:, ::-1], N-j-1-i) 
>>> np.sum(diagonal) + np.sum(antidiagonal) 

これは、動作します。したがって、np.diag(a, j-i)は、8に対応する対角線を正しく選択します。

対角形の場合は、配列を水平方向に反転させて()再度実行します。しかし、新しい列インデックスはN-j-1ですが、行インデックスはiのままです。

a[:, ::-1]が判読できない場合は、代わりにnp.fliplr(a)またはnp.flipud(a)を使用することができます。

+0

ありがとう – darekarsam

+0

'np.flipud 'は' a [:。:: - 1] 'の代わりにここで動作します – Eric

+0

@Eric Not quite。 ['np.fliplr'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.fliplr.html)でも動作します。しかし、両者がデータのビューを返してくるのを見ると、コンマで区切られたリストを異なるインデックスにすることができるようなわずかなバリエーションがあれば、一般的に理解されているPythonのスライス構文を使用するため、 'a [:, :: - 1]寸法。一方、 'np.fliplr'は比較的曖昧な関数への参照です(少なくとも、私はあなたのコメントの前にそれに精通していませんでした)。 PS:typoをつかんでくれてありがとう:-) – Praveen

関連する問題