MasterWizard
MasterWizard

Reputation: 877

Reverse diagonal on numpy python

let's say I have this: (numpy array)

a=
[0  1  2  3],
[4  5  6  7],
[8  9 10  11]

to get [1,1] which is 5 its diagonal is zero; according to numpy, a.diagonal(0)= [0,5,10]. How do I get the reverse or the right to left diagonal [2,5,8] for [1,1]? Is this possible? My original problem is an 8 by 8 (0:7).. I hope that helps

Upvotes: 14

Views: 20967

Answers (4)

Phil Cooper
Phil Cooper

Reputation: 5877

A number of answers so far. @Akavall is closest as you need to rotate or filip and transpose (equivilant operations). I haven't seen a response from the OP regarding expected behavior on the "long" part of the rectangle.

Generalized solution for a square matrix:

a = 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]])
>>> [(i, np.rot90(a).diagonal(2*i-a.shape[0]+1)) for i in range(a.shape[0])]
[(0, array([0])),
 (1, array([ 2,  6, 10])),
 (2, array([ 4,  8, 12, 16, 20])),
 (3, array([14, 18, 22])),
 (4, array([24]))]

As a function:

def reverse_diag(arr, n):
    idx = 2*n - arr.shape[0]+1
    return np.rot90(arr).diagonal(idx)

original matrix can be made square with a[:np.min(a.shape),:np.min(a.shape)]

EDIT: OP indicated the array is square.... Final Answer is the above

Upvotes: 0

Akavall
Akavall

Reputation: 86316

Another way to achieve this is to use np.rot90

import numpy as np

a = np.array([[0,  1,  2,  3],
              [4,  5,  6,  7],
              [8,  9, 10,  11]])            

my_diag = np.rot90(a).diagonal(-1)

Result:

>>> my_diag
array([2, 5, 8])

Upvotes: 4

falsetru
falsetru

Reputation: 369424

Get a new array each row reversed.

>>> import numpy as np
>>> a = np.array([
...     [0, 1, 2, 3],
...     [4, 5, 6, 7],
...     [8, 9, 10, 11]
... ])
>>> a[:, ::-1]
array([[ 3,  2,  1,  0],
       [ 7,  6,  5,  4],
       [11, 10,  9,  8]])
>>> a[:, ::-1].diagonal(1)
array([2, 5, 8])

or using numpy.fliplr:

>>> np.fliplr(a).diagonal(1)
array([2, 5, 8])

Upvotes: 18

wim
wim

Reputation: 363456

Flip the array upside-down and use the same:

np.flipud(a).diagonal(0)[::-1]

Upvotes: 5

Related Questions