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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

4回答

426閲覧

2つのリストの中にある数字を掛け算や割り算の仕方が分かりません。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2022/07/02 11:50

前提

次のような2つのリストがあります。

python

1x = [0.1, 4, 5] 2y = [ 3 [3, 9, 0], 4 [1, 0.5, 5], 5 [3, 7, 2] 6]

実現したいこと

xというリストとyというリストのそれぞれの値を用いて次のような計算をしたいです。

python

1(x[0]x[1]y[0][0]+x[0]x[2]y[0][1]+x[1]x[2]y[0][2])/x[0]x[1]+x[0]x[2]+x[1]x[2]=0.27272727 2(x[0]x[1]y[1][0]+x[0]x[2]y[1][1]+x[1]x[2]y[1][2])/x[0]x[1]+x[0]x[2]+x[1]x[2]=4.81578947 3(x[0]x[1]y[2][0]+x[0]x[2]y[2][1]+x[1]x[2]y[2][2])/x[0]x[1]+x[0]x[2]+x[1]x[2]=2.13875598

考えたこと

まず、分母の計算を実装するためには、for文を用いてxとyを掛け合わした後にsum関数を用いて足し算するのがいいかなと思いました。
この思考で掛け合わせるところまでのコードをfor文で書いて見ると、以下のような値が出てきました。
出力結果の最初の値0はx[0]x[1]y[0][0]の値が出力されたと考えられるので照らし合わせて見ると、
x[0]x[1]y[0][0] = 0.143 = 1.2なので異なる値が出力されてしまいました。
どのようにコードを書いたら、実現したいことが実現できるのでしょうか?

python

1x = [0.1, 4, 5] 2y = [ 3 [3, 9, 0], 4 [1, 0.5, 5], 5 [3, 7, 2] 6] 7 8for random_1 in range(len(x)): 9 for random_2 in range(len(x[1:])): #range(len(x[1:]))としたのはx[0]x[1]やx[1]x[2]のように必ず片方のx[]はもう一つのx[]よりも大きくなっているからです。 10 for random_3 in y: #二次元リストyのy[0]からy[2]をそれぞれ抜き出しています。 11 for random_4 in random_3: #y[0][0]からy[2][2]を抜き出しています。 12 random = x[random_1]*x[random_2]*random_4 13 print(random) 14#出力結果 150.0 160.05000000000000001 170.020000000000000004 180.0 192.0 200.8 210.0 222.0 230.8 240 2580 2632 270.0 282.5 291.0 300 31100 3240

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

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

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

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

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

guest

回答4

0

Numpy を使う場合。

python

1import numpy as np 2 3x = [0.1, 4, 5] 4y = [ 5 [3, 9, 0], 6 [1, 0.5, 5], 7 [3, 7, 2] 8] 9 10idx = np.transpose(np.triu_indices(len(x), 1)) 11denom = np.array(x)[idx].prod(axis=1) 12result = (denom * y).sum(axis=1) / denom.sum() 13 14print(result)

投稿2022/07/02 12:28

melian

総合スコア19803

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

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

退会済みユーザー

退会済みユーザー

2022/07/02 13:28

ありがとうございます。やはり、複雑な計算はnumpyを使った方がコードが短く済むんですね。
guest

0

ベストアンサー

py

1print(sum(x[i % 3]*x[(i+1) % 3]*y[0][(3-i) % 3] for i in range(3)) / 2 sum(x[j % 3]*x[(j+1) % 3] for j in range(3))) 3 4print(sum(x[i % 3]*x[(i+1) % 3]*y[1][(3-i) % 3] for i in range(3)) / 5 sum(x[j % 3]*x[(j+1) % 3] for j in range(3))) 6 7print(sum(x[i % 3]*x[(i+1) % 3]*y[2][(3-i) % 3] for i in range(3)) / 8 sum(x[j % 3]*x[(j+1) % 3] for j in range(3))) 9

投稿2022/07/02 12:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/07/02 13:31

ありがとうございます!
guest

0

(a + b + c) / d + e + f(a + b + c) / (d + e + f) とは異なります。

Python

1x = [0.1, 4, 5] 2y = [ 3 [3, 9, 0], 4 [1, 0.5, 5], 5 [3, 7, 2] 6] 7 8a, b, c = x[0]*x[1], x[0]*x[2], x[1]*x[2] 9d = a + b + c 10for i in range(3): 11 print(f'{(a*y[i][0] + b*y[i][1] + c*y[i][2]) / d:.8f}')

投稿2022/07/02 12:59

kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2022/07/02 13:30

ありがとうございます。すいません、今回の質問は(a + b + c) / (d + e + f)の方でしたね。
guest

0

まずいろいろな場所に分かれて出てくるx[0]x[1]+x[0]x[2]+x[1]x[2]の部分をx_tuple = (x[0]*x[1], x[0]*x[2], x[1]*x[2])としておけば、sum関数で足せる上にバラバラでも処理できるようになります。
あとはzip関数でまとめたものをリスト内法表記でかけ合わせていけば、だいぶ短縮できると思います。

必要かどうかよく分からない追記:
端ちょっと出てます(ノД`)・゜・。

Python

1x = [0.1, 4, 5] 2y = [ 3 [3, 9, 0], 4 [1, 0.5, 5], 5 [3, 7, 2] 6] 7x_tuple = (x[0]*x[1], x[0]*x[2], x[1]*x[2]) 8for i in range(len(y)): 9 print(f"{i + 1}...{sum([j[0] * j[1] for j in zip(x_tuple, y[i])]) / sum(x_tuple)}")

出力結果

output

11...0.27272727272727276 22...4.8157894736842115 33...2.1387559808612444

投稿2022/07/02 12:36

編集2022/07/02 12:45
futsuuu

総合スコア4

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

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

退会済みユーザー

退会済みユーザー

2022/07/02 13:29

ありがとうございます。なるほど、一度、一つにまとめておけばバラバラでも処理できるようになるんですね。
退会済みユーザー

退会済みユーザー

2022/07/02 13:37

確かにこのような考え方の方が短縮できていいですね!!
退会済みユーザー

退会済みユーザー

2022/07/04 10:22

すみません、追加で質問したいのですが、もしリストxに格納されている数字が大量に(例えば、x[0]~x[100])あり、x[0]*x[1], x[0]*x[2], x[1]*x[2],,,と書くのが大変になる場合は、for文で回すのがいいのでしょうか?
futsuuu

2022/07/09 01:37

全ての要素を二つずつかけていくということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問