凄く前の質問ですが自己満足のために書きます。
スライスの各座標に対応する引数はブロードキャストされるので、
arr[[0,2],2]はarr[[0,2],[2,2]]となります。
arrのインデックス0と2それぞれのインデックス2, 2となるので[2,8]になります。
しかし、arr[[0,2],2:]はスライスとは異なります。
試しにarr[[0,2],1:]でやってみると、
python
1>>> arr[[0,2],1:]
2array([[1, 2],
3 [7, 8]])
となり、インデックス0と2それぞれの[1:]が出力されます。
[2:]でも同様の処理がなされるため、
arr[[0,2],2:]はインデックス0と2の[2:]が出力されて[[2],[8]]になります。
###個人的な考え方
Numpyはスライス時にもブロードキャストを行うので、
arr[[0,2],2]はarr[[0,2],[2,2]]ということになります。
しかし、arr[[0,2],2:]の場合は、arr[[0,2],2]=arr[[0,2],[2,2]]にはなりません。
もしarr[[0,2],1:]だった時に、arr[[0,2],[1,2]]になったら結果が異なりますよね。
Python
1>>> arr[[0,2],1:]
2array([[1, 2],
3 [7, 8]])
4>>> arr[[0,2],[1,2]]
5array([1, 8])
このように、0と1、2と2が対応してしまいます。
このことから、「2:」は、シンプルにnp.arange(1)+2=[2]とはなっていないことが分かります。
ではどのような計算が行われているかというと、逆にスライスの第一引数が変形されているのです。
arr[[0,2],1:]の結果は[[1,2],[7,8]]です。二次元配列上での座標を表してみましょう。
1は[0,1] 2は[0,2]
7は[2,1] 2は[2,2]となります。
よって第一引数は[[0,0],[2,2]]
第二引数は[[1,2],[1,2]]
となっています。
第一引数が変形されているので、計算を順に表してみましょう。
arr[[0,2],1:]
arr[[0,2],[1,2]]
arr[[[0],[2]],[1,2]]
arr[[[0,0],[2,2]],[1,2]]
arr[[[0,0],[2,2]],[[1,2],[1,2]]]
「:」は第一引数にも影響を与えることを考慮して、arr[[0,2],2:]の場合も考えると、
arr[[0,2],[2]]
arr[[[0],[2]],[2]]
になります。
Python
1>>> arr[[[0],[2]],[2]]
2array([[2],
3 [8]])
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/18 07:02
2021/10/18 11:56