理解する上で、幾つか知っておかないといけないことがあります。一つずつ説明します。それぞれは単純です。
その1
numpy配列に対して比較演算を行うとboolの配列ができます。
python
1>>> import numpy as np
2>>> a = np.arange(10)
3>>> a
4array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
5>>> a > 5
6array([False, False, False, False, False, False, True, True, True,
7 True])
8>>> a == 3
9array([False, False, False, True, False, False, False, False, False,
10 False])
その2
boolの配列を使って配列から値を取り出せます。
python
1>>> a % 2 == 0 # 偶数かどうか
2array([ True, False, True, False, True, False, True, False, True,
3 False])
4>>> a[a % 2 == 0]
5array([0, 2, 4, 6, 8])
その3
二次元配列に対するインデクシングては、カンマで区切って行、列に対してそれぞれ取り出し方を指定することができます。
python
1>>> a = np.arange(15).reshape(3, 5)
2>>> a
3array([[ 0, 1, 2, 3, 4],
4 [ 5, 6, 7, 8, 9],
5 [10, 11, 12, 13, 14]])
6>>> a[0, 3]
73
8>>> a[2, 1]
911
上の例では要素を取り出しています。他に、こういうこともできます。
python
1>>> a = np.arange(15).reshape(3, 5)
2>>> a[:,0]
3array([ 0, 5, 10])
:
というのはスライスのリテラルで、この場合は特に何も指定していないので無条件ですべて取れという指示になります。行方向にはすべて取る、列方向で0を指定。すると0列目を取得することができます(一次元配列として結果が得られますが、これはそういうものだと思ってください)。
組み合わせる
質問文のコードでXはこんなデータです(中身は適当です)。
python
1>>> X = np.arange(12).reshape(6, 2)
2>>> X
3array([[ 0, 1],
4 [ 2, 3],
5 [ 4, 5],
6 [ 6, 7],
7 [ 8, 9],
8 [10, 11]])
X[y==0, 0]
なら、行方向ではy==0
の要素がTrue
のところだけ抜き出す、列方向では0列目だけ抜き出すという指定の仕方になります。
python
1>>> X[[True, False, True, False, True, False], 0]
2array([0, 4, 8])
体系的に理解する場合
公式のここを見ると良いと思います。
Indexing — NumPy v1.17 Manual
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。