2013-11-23 45 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]。如何获得[1,1]的反向或从左到右的对角线[2,5,8]?这可能吗? 我原来的问题是一个8乘8(0:7)..我希望可以帮助

+1

有两个答案出现不够一般化,因为你的样本很小。你想要[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是最接近你需要旋转或filip和转置(equivilant操作)。我没有看到任何关于矩形“长”部分的预期行为的回复。

对于正方形矩阵的广义溶液:

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:OP表示的阵列是正方形.... 最终答案就是上面的