2010-12-14 18 views
9

これは単純です(3行ループを書くのは簡単です)が、numpyスライスを使用してnumpy配列の上対角のインデックス位置のリストを作成するにはどうすればよいですか?私。 4x4の配列を指定して2D numpy配列の上対角

、私はX年代のインデックスの場所が欲しい:

与える ​​

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

答えて

8

カーニエリは私にnumpy.triu_indices答えを叩いたが、numpy.triu_indices_fromもあり、寸法ではなく入力として配列をとる。

+0

おかげで(ジャスティンとCarnieri)。注意すべきことは2つありますが、これはnumpy 1.4が必要です。これは現在Ubuntuの標準ではありません。また、答えを解凍するだけで、要求された指標を得ることもできます。 'zip(* numpy.triu_indices(X))'となります。 – Hooked

6

をインデックスの場所の形式ですが異なっている、それはあなたが機能を望むように思われるnumpy.triu_indices

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)] 
関連する問題