質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

600閲覧

Python3のリストの表記が分かりません

Tori_Taro

総合スコア1

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/17 13:42

前提・実現したいこと

Python3での課題で、さいころの出目に対して分散・標準偏差を求めるコードを書いています。
サンプルコードにあるコードが理解できません。

発生している問題・エラーメッセージ

試行回数は100回です。
リスト dice_try の中に100回分の試行結果の出目が格納されているのはわかります。
分からないのがfor文の中のdice_try[dice_try==i] です。

出力すると各出目だけが取り出されたリストになっていました。
[]の中はインデックス番号を表すものだと思っていたのですが、dice_try[dice_try==i]の部分はどのような動きをしているのでしょうか。
もしこの表記や構文に名称があったら教えていただきたいです。

該当のソースコード

Python3

steps =100
dice_try = np.random.choice(dice, steps)
p = []
for i in range(1,7):
n_i = len(dice_try[dice_try==i]) # 各目が何回発生したかをカウント
p.append(n_i) #各目の発生した回数をリストに格納

###試したこと
教則本、ネットでリストに関する項を確認した
同級生に質問した。
同級生は内包表記ではないかと言っていたが私は確信できないので質問させていただきました。

###補足情報
現在大学生でまだまだpythonについての理解が及びません。
基礎的な質問になってしまい申し訳ないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 13:57

編集2020/05/17 14:04
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tori_Taro

2020/05/17 14:17

迅速かつ丁寧な回答に感謝します。 とても助かりました。 NumPy配列のことを失念していて調べそびれていました。もう一度よく確認しておきます。 例や解説も理解しやすかったです。 ありがとうございます。 またご縁ありましたら助けていただけると嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問