這看起來很簡單(並且爲寫一個三線循環很麻煩),但是如何使用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) ]
這看起來很簡單(並且爲寫一個三線循環很麻煩),但是如何使用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) ]
carnieri擊敗我numpy.triu_indices
答案,但也有numpy.triu_indices_from
它需要一個數組作爲輸入,而不是尺寸。
雖然索引位置的格式不同的是,它好像你想要的功能numpy.triu_indices
。
如果您正在運行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)]
感謝您的回答(賈斯汀和Carnieri)。需要注意的兩點是,這需要numpy 1.4,目前這不是Ubuntu的標準。也可以通過簡單地解開答案來獲得所需的索引,即。 '拉鍊(* numpy.triu_indices(X))'。 – Hooked 2010-12-19 16:46:43