numpyスライシングのカルトクイズ

問:空欄に入る出力を答えよ

>>> m = array([[1, 2], [3, 4]])
>>> m
array([[1, 2],
       [3, 4]])

>>> x = [True, False]
>>> m[x]
(Q1)

>>> m[array(x)]
(Q2)

>>> m[tuple(x)]
(Q3)

もちろんわざわざ問題にしているってことは全部結果が違うってことですよ!


可能であれば理由も付けて回答してください。


正解はこちら

>>> m = array([[1, 2], [3, 4]])
>>> m
array([[1, 2],
       [3, 4]])

>>> x = [True, False]
>>> m[x] # (Q1)
array([[3, 4],
       [1, 2]])

>>> m[array(x)] # (Q2)
array([[1, 2]])

>>> m[tuple(x)] # (Q3)
3

Q1は渡しているのがリストなのでintのリスト(True==1、False==0)とみなして、該当rowが選択されている。Q2はarrayに入れたことでboolのarrayとみなされるようになって、Trueのrowだけが選択される。Q3はタプルにしたことでm[1, 0]という記法でアクセスしているとみなされて1番目のrowの0番目の要素が選択されている。