Pythonのリストの仕様ではなく、np.ndarrayの機能です。
実際に何が行われているか見てみましょう。
まず適当にアレイを作ります。
Python
1>>> import numpy as np
2>>>
3>>> arr = np.array([i for i in range(3) for _ in range(3)])
4>>> np.random.shuffle(arr)
5>>> print(arr)
6[1 0 2 1 2 0 0 2 1]
次に、条件式を適用した結果を見てみます。
Python
1>>> arr == 2
2array([False, False, True, False, True, False, False, True, False], dtype=bool)
3>>>
4>>> arr % 2 == 0
5array([False, True, True, False, True, True, True, True, False], dtype=bool)
条件を満たす要素だけTrueになっていることがわかります。
今度は、インデックスとして真偽値のリストを与えてみます。
Python
1>>> cond = [True, True, True, False, True, False, True, False, False]
2>>> print(arr[cond])
3[1 0 2 2 0]
適当に決めたので、condの値に特に意味はありません。
ここで重要なのは、Trueに対応した要素だけ抽出されていることです。
ここで確かめた二つの記法を組み合わせると、質問のような動作が実現されます。
追記
中ではどのようなことが行われることになるか説明いただけないでしょうか。
ひょっとして、具体的な実装が気になるのでしょうか。
簡単なNumPyアレイもどきを作ってみました。対応している演算は%
と==
だけです。
Python
1class np_subset:
2 def __init__(self, arr):
3 self._arr = list(arr)
4
5 def __iter__(self):
6 return iter(self._arr)
7
8 def __mod__(self, num):
9 return np_subset(
10 elem % num for elem in self._arr
11 )
12
13 def __eq__(self, other):
14 return np_subset(
15 elem == other for elem in self._arr
16 )
17
18 def __getitem__(self, tf_arr):
19 return np_subset(
20 elem for elem, tf in zip(self._arr, tf_arr) if tf
21 )
22
23 def __str__(self):
24 return ' '.join(
25 map(str, self._arr)
26 )
Wandbox
演算子をオーバーロードしているだけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/04 03:36
2018/08/04 03:44
2018/08/04 04:27
2018/08/04 05:27