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

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

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

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

Q&A

解決済

1回答

524閲覧

pythonでの確率分布

CHIVI

総合スコア5

Python

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

0グッド

0クリップ

投稿2020/02/29 14:34

前提・実現したいこと

python初心者です 
リストのランダムな数値を入力した数値だけ足し合わせた結果をすべて表示し確率分布にまとめるプログラムを作成したいです
ex)list=[0,1,2] があったときに2と入力したとすると(0+0,0+1,0+2,1+0,1+1,1+2,2+0,2+1,2+2)という結果をグラフにまとめ0の確率,1の確率〃
と表示されてほしいです
作り方についてアドバイスいただけると幸いです

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/29 19:49

まず問題を整理しましょう。 1.ランダムな数値が入ったリストがある。 2.入力された数値の回数分だけ、「入力された数値+リストの値」を計算する。 ここまでは合っていますか? 3.リストの値と入力値の値によって、合計の値が変化する(2.の工程に相当)ので、それが発生回数/全体の処理回数を確立として表示したい。 こういうことでしょうか?
guest

回答1

0

ベストアンサー

直積の列挙

itertools.productを用いることが出来ます。

python

1>>> from itertools import product 2>>> list(product(lst, repeat=2)) 3[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

itertools --- 効率的なループ実行のためのイテレータ生成関数 — Python 3.8.2 ドキュメント

和のiterableにする

やり方の候補はいくつかあります。

  • forループを書く
  • 内包表記を書く
  • mapsumで書く

どれにしろロジックとしては同じで、各要素ごとの合計のiterableが最終的にできればいいでしょう。

python

1>>> list(map(sum, product(lst, repeat=2))) 2[0, 1, 2, 1, 2, 3, 2, 3, 4]

数える

collections.Counterとかでやってみます。

python

1>>> Counter(map(sum, product(lst, repeat=2))) 2Counter({2: 3, 1: 2, 3: 2, 0: 1, 4: 1})

collections --- コンテナデータ型 — Python 3.8.2 ドキュメント

割合にする

Counterの値の総和で割るだけなので楽勝です。

python

1>>> cnt = Counter(map(sum, product(lst, repeat=2))) 2>>> total = sum(cnt.values()) 3>>> proportions = {k:v/total for k ,v in cnt.items()} 4>>> proportions 5{0: 0.1111111111111111, 1: 0.2222222222222222, 2: 0.3333333333333333, 3: 0.2222222222222222, 4: 0.1111111111111111} 6

グラフにする

作った割合の辞書のキーの最小値と最大値の区間で棒グラフを描くだけなので、これもまた簡単です。

どんなグラフを意図しているのかよくわからなかったので、とりあえず棒グラフにしました。

python

1>>> sorted_props = sorted(proportions.items()) 2>>> x, y = zip(*sorted_props) 3>>> x 4(0, 1, 2, 3, 4) 5>>> y 6(0.1111111111111111, 0.2222222222222222, 0.3333333333333333, 0.2222222222222222, 0.1111111111111111) 7>>> import matplotlib.pyplot as plt 8>>> plt.bar(x, y, align="center") 9<Container object of 5 artists> 10>>> plt.show() 11

イメージ説明

matplotlib.pyplot.bar — Matplotlib 3.1.0 documentation

あとは適切な入出力処理のあるプログラムにまとめて細かい挙動や見た目の調整をすれば完成です

投稿2020/03/01 00:28

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問