2010-12-14 175 views
9

這看起來很簡單(並且爲寫一個三線循環很麻煩),但是如何使用numpy切片製作一個numpy數組的上對角線的索引位置的列表?即2D numpy數組的上對角線

給定一個4x4的陣列,我想在X的指數位置:

​​

,並提供:

[ (0,0), (0,1), (0,2), (0,3), (1,1), (1,2), (1,3), (2,2), (2,3), (3,3) ] 

回答

8

carnieri擊敗我numpy.triu_indices答案,但也有numpy.triu_indices_from它需要一個數組作爲輸入,而不是尺寸。

+0

感謝您的回答(賈斯汀和Carnieri)。需要注意的兩點是,這需要numpy 1.4,目前這不是Ubuntu的標準。也可以通過簡單地解開答案來獲得所需的索引,即。 '拉鍊(* numpy.triu_indices(X))'。 – Hooked 2010-12-19 16:46:43

2

如果您正在運行Ubuntu,並且不希望升級numpy的只是這一點,你可以使用下面的功能:

from itertools import chain 
triu_indices = lambda x, y=0: zip(*list(chain(*[[(i, j) for j in range(i + y, x)] for i in range(x - y)]))) 

例子:

In [26]: triu_indices = lambda x, y=0: zip(*list(chain(*[[(i, j) for j in range(i + y, x)] for i in range(x - y)]))) 

In [27]: triu_indices(4) 
Out[27]: [(0, 0, 0, 0, 1, 1, 1, 2, 2, 3), (0, 1, 2, 3, 1, 2, 3, 2, 3, 3)] 

In [28]: zip(*triu_indices(4)) 
Out[28]: 
[(0, 0), 
(0, 1), 
(0, 2), 
(0, 3), 
(1, 1), 
(1, 2), 
(1, 3), 
(2, 2), 
(2, 3), 
(3, 3)]