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

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

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

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

Q&A

解決済

3回答

1116閲覧

pythonの2次元リストの演算と加重平均の求め方について

saga.

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/06/21 07:39

2次元のリストの演算についてわかる方がいれば、教えていただければと思います。
下記のリストから103の10倍(未満)のところまで、今回だと987ですので4つ目のところまでの
要素2つの加重平均を求めたいです。
このリストであれば、
(103×0.01+345×0.06+654×0.02+987×0.01)÷(0.01+0.06+0.02+0.01)=
『446.8』
になるようなプログラミングを作りたいです。
わかる方がいれば、お願いいたします。

l = [[103, 0.01], [345, 0.06], [654, 0.02], [987, 0.01], [1010, 0.02], [1242, 0.5]] find_idx = False for p in range(len(l)): if l[p][0] - l[0][0] >= l * 10: find_idx = True break if find_idx: a = b = w_avg = np.average(a, weights=b) print(w_avg)

if find_idx以下で
加重平均を調べるコードを書こうと、
自分なりに調べてやっていますが、行き詰まり、わからなくなってしまいました。
お力添えいただければと思います。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

正確か不明ですが、numpyなどは使わずにいってみたら

Python

1l = [[103, 0.01], [345, 0.06], [654, 0.02], [987, 0.01]] 2sm = sum(map(lambda x:x[0]*x[1], l)) 3print(sm / sum(l[n][1] for n in range(len(l)))) 4# 446.8000000000001 ≒ 446.8

投稿2020/06/21 08:16

編集2020/06/21 09:13
ForestSeo

総合スコア2722

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

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

saga.

2020/06/21 08:31

回答ありがとうございます。 参考になります!
ForestSeo

2020/06/21 09:14 編集

小数点計算なので、ずれるのはしょうがないっぽいですね。 tiitoi さんの回答もずれてますし。(446.8000000000001) 四捨五入とかしたらいいと思います。
guest

0

103の10倍未満であれば1010まで含むと思います。
他にもいろいろコードの書き方がありますが、できるだけ素朴なコードとしてみました。
下記コードで1010まで含み答えは540.6666666666667です。

l = [[103, 0.01], [345, 0.06], [654, 0.02], [987, 0.01], [1010, 0.02], [1242, 0.5]] sum_l1 = 0 sum_l2 = 0 for ll in l: ll1, ll2 = ll if ll1 < 103 * 10: sum_l1 += ll1 * ll2 sum_l2 += ll2 print(sum_l1 / sum_l2)

まことに僭越ながら、宿題の類でしょうか。勢いで回答してしまいましたが、この程度は理解されておかないと
後が困ると思います。入門書の例題をコード写経で繰り返されると実りが多いです。

投稿2020/06/21 07:58

aokikenichi

総合スコア2240

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

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

saga.

2020/06/21 08:30

ありがとうございます。 地道に学んでいきます。
guest

0

ベストアンサー

numpy を使うのであれば、スライスで4行目までを抽出してください。

    1. numpy.searchsorted() で 103 * 10 = 1030 を1列目に挿入する場合、どの行になるかを取得する。

searchsorted() の例

python

1print(np.searchsorted([103, 345, 654, 987, 1010, 1242], 1030)) 2# 5
    1. data[: i - 1] で1行目 ~ 4行目までをスライスする。

※ 1030未満なら5行目も含む気がしますが、質問に4行目と書いてあるので、-1 しています。5行目の含むのであれば、data[:i] としてください。

python

1[[103.0, 0.01], [345.0, 0.06], [654.0, 0.02], [987.0, 0.01]]
    1. numpy.average() で加重平均を計算する。

python

1np.average([103, 345, 654, 987], weights=[0.01, 0.06, 0.02, 0.01])

サンプルコード

python

1import numpy as np 2 3data = np.array( 4 [[103, 0.01], [345, 0.06], [654, 0.02], [987, 0.01], [1010, 0.02], [1242, 0.5]] 5) 6 7i = np.searchsorted(data[:, 0], data[0, 0] * 10) 8print(i) # 5 9 10ret = np.average(data[: i - 1, 0], weights=data[: i - 1, 1]) 11print(ret) # 446.8000000000001

投稿2020/06/21 08:03

編集2020/06/21 08:06
tiitoi

総合スコア21956

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

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

saga.

2020/06/21 08:31

回答ありがとうございます。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問