得到一个numpy数组的对角线

Rya*_*axe 28 python arrays numpy

所以在numpy数组中有内置函数来获取对角线索引,但我似乎无法弄清楚如何从右上角而不是左上角开始对角线.

这是从左上角开始的常规代码:

>>> import numpy as np
>>> array = np.arange(25).reshape(5,5)
>>> diagonal = np.diag_indices(5)
>>> array
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]])
>>> array[diagonal]
array([ 0,  6, 12, 18, 24])
Run Code Online (Sandbox Code Playgroud)

所以如果我想要它返回,我该怎么用:

array([ 4,  8, 12, 16, 20])
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 36

In [47]: np.diag(np.fliplr(array))
Out[47]: array([ 4,  8, 12, 16, 20])
Run Code Online (Sandbox Code Playgroud)

要么

In [48]: np.diag(np.rot90(array))
Out[48]: array([ 4,  8, 12, 16, 20])
Run Code Online (Sandbox Code Playgroud)

其中两个,np.diag(np.fliplr(array))更快:

In [50]: %timeit np.diag(np.fliplr(array))
100000 loops, best of 3: 4.29 us per loop

In [51]: %timeit np.diag(np.rot90(array))
100000 loops, best of 3: 6.09 us per loop
Run Code Online (Sandbox Code Playgroud)

  • 你开始计时了,所以这是我最快速的做法:`step = len(array) - 1; np.take(array,np.arange(step,array.size,step))` (4认同)
  • 我把蒂姆·彼得斯的"禅之禅"挂在我的立方体墙上,就在我的显示器旁边.我不能发表评论的代码作为答案,而**可读性计数**正在看着我......:P你的'fliplr`解决方案可能是最好的:足够快,多了,当你再次访问时更容易理解写完后几个月. (2认同)