これは単純です(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) ]
これは単純です(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) ]
カーニエリは私に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)。注意すべきことは2つありますが、これはnumpy 1.4が必要です。これは現在Ubuntuの標準ではありません。また、答えを解凍するだけで、要求された指標を得ることもできます。 'zip(* numpy.triu_indices(X))'となります。 – Hooked