dice_try[dice_try==i]の部分はどのような動きをしているのでしょうか。
np.random.choice(dice, steps)
は Python のリストではなく、numpy 配列を返します。
まず、dice_try == i
が評価されて、dice_try の値が i
の要素は True、そうでない要素は False の dice_try と同じ大きさの bool 型の配列が返ります。
numpy 配列の [] にその配列と同じ大きさの bool 型の配列を渡すと、True の位置の要素だけ抽出されます。(bool indexing という機能です。)
NumPy配列のブールインデックス参照 | hydroculのメモ
python
1import numpy as np
2
3a = np.array([3, 2, 3, 4, 4, 4, 5, 4, 2, 1, 4, 4, 5, 3, 1, 1, 6, 5, 5, 4])
4
5# dice_try の値が i の要素は True、そうでない要素は False の dice_try と同じ大きさの bool 型の配列ができる
6print(a == 1)
7# [False False False False False False False False False True False False
8# False False True True False False False False]
9
10# これを numpy 配列の [] にわたすと、True の要素だけ抽出される。
11print(a[a == 1])
12# [1 1 1]
[]の中はインデックス番号を表すものだと思っていたのですが、
リストやタプルだとそうなりますが、numpy はそれ以外にもいろいろ指定方法があります。
__getitem__()
という関数を実装すると、自作したオブジェクトに対して、[] が呼び出された場合の挙動を制御できます。numpy もこれを利用して、bool indexing のような機能を実現しています。
python
1class Vector:
2 def __init__(self, items):
3 self.items = items
4
5 def __getitem__(self, idx):
6 return self.items[idx]
7
8
9vec = Vector(["A", "B", "C"])
10print(vec[1]) # B
参考
dice_try == i
で値が i
の要素は True、そうでない要素は False の配列が取得できるので、True が1、False が0と同値であることを利用すると、bool indexing を使わなくても、この bool 配列の sum() をとれば、それが値が i
の要素数になりますね。
python
1import numpy as np
2
3steps = 100
4dice_try = np.random.choice(dice, steps)
5
6p = [(dice_try == i).sum() for i in range(1, 7)]
7print(p) # [16, 17, 15, 23, 12, 17]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/17 14:17