私は数年前からnumpyを使用していましたが、このような機能は見たことがありません。
In [47]: a
Out[47]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [48]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[48]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])
別々の段階へのワンライナー内訳:
は、ここでは、(必ずしも最も効率的に)それを行うことができ一つの方法だ
In [59]: a[::-1, :]
Out[59]:
array([[12, 13, 14, 15],
[ 8, 9, 10, 11],
[ 4, 5, 6, 7],
[ 0, 1, 2, 3]])
:
a[::-1, :]
は、行を反転させます
(これはa[::-1]
またはnp.flipud(a)
と書くこともできます)
np.diagonal(a, k)
は、k
番目の対角を抽出します。k=0
が主対角です。だから、リスト内包で例えば、
In [65]: np.diagonal(a[::-1, :], -3)
Out[65]: array([0])
In [66]: np.diagonal(a[::-1, :], -2)
Out[66]: array([4, 1])
In [67]: np.diagonal(a[::-1, :], 0)
Out[67]: array([12, 9, 6, 3])
In [68]: np.diagonal(a[::-1, :], 2)
Out[68]: array([14, 11])
、k
が抽出されるように対角線を与えます。他のすべての対角線の要素を逆にしたい。式2*(k % 2) - 1
は、k
が-3から3まで変化するため、値1、-1、1、...を返します。[::1]
でインデックスを付けると、配列の順序は変更されず、インデックスは[::-1]
で配列の順序が逆になります。だから、np.diagonal(a[::-1, :], k)[::(2*(k % 2)-1)]
が与える対角線番目が、他のすべての対角線逆転とk
:
In [71]: [np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])]
Out[71]:
[array([0]),
array([1, 4]),
array([8, 5, 2]),
array([ 3, 6, 9, 12]),
array([13, 10, 7]),
array([11, 14]),
array([15])]
np.concatenate()
は、単一の配列にそれらすべてを置く:
In [72]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[72]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])
これはジグザグの対角線ですか?その技術的な名前はありますか?目的は何ですか? – hpaulj