2013-11-23 3 views
5

скажем, у меня есть это: (Numpy массив)обратной диагонали на Numpy питона

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

, чтобы получить [1,1], которая является 5 его диагональ равна нулю; в зависимости numpy, a.diagonal(0)= [0,5,10]. Как получить обратную или правую слева диагональ [2,5,8] для [1,1]? Это возможно? Моя первоначальная проблема - 8 на 8 (0: 7) .. Надеюсь, что помогает

+1

есть два ответа, которые выглядят недостаточно обобщенными, потому что ваш образец a невелик. Вы хотите, чтобы ответ для [2,2] был [7, 10]? связанный с этим вопрос, можете ли вы быть прямоугольным в другом направлении (высокий не широкий)? –

+0

Мой пример - 8 на 8 (0: 7) .. Надеюсь, что поможет – MasterWizard

ответ

6

Получите новый массив, каждый из которых изменился на противоположный.

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

или с помощью numpy.fliplr:

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

Примечание: для общего случая это требует вычисления смещения с другой стороны массива, например. вам нужно будет использовать 'a.shape' в ваших расчетах – wim

+0

@wim, вы правы. Ваш ответ более изящный в отношении этого вопроса. Спасибо за комментарий. +1 – falsetru

+0

В моей программе я не узнаю «1» внутри диагональной функции? Как мне это получить? – MasterWizard

5

Флип массив вверх-вниз и использовать один и тот же:

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

Другой способ для достижения этой цели является использование 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) 

Результат:

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

Число ответов пока. @Akavall ближе всего, так как вам нужно вращать или фиксировать и переносить (эквиквизиционные операции). Я не видел ответа от ОП относительно ожидаемого поведения на «длинной» части прямоугольника.

Обобщенное решение для квадратной матрицы:

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

В качестве функции:

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

исходная матрица может быть квадрат с a[:np.min(a.shape),:np.min(a.shape)]

EDIT: ОП указывает на массив квадрат .... Итоговый ответ приведен выше

Смежные вопросы