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

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

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

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

Q&A

解決済

2回答

781閲覧

Python 期待通りの計算結果になりません。正しい計算ロジックを教えてください。

moto_i

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2019/04/06 07:33

行列演算に関する質問です。下記のリストがあります。
list = [[7, 2, 1, 3], [15, 4, 1, 5], [20, 5, 1, 10]]

各行の要素を各行の先頭の値と末尾の値を足した合計で除算した後100倍にしたいです。
[7, 2, 1, 3] であれば 先頭の値が7,末尾の値が3なので、合計が10となり
各要素の値は10で割られて
0.7, 0.2, 0.1, 0.3 となります。
これを100倍して
70, 20, 10, 30というような計算処理をしたいです。
が思ったように計算ができません。
正しいロジックを教えてください。

Python

1list = [[7, 2, 1, 3], [15, 4, 1, 5], [20, 5, 1, 10]] 2 3calc_list = [[0]*4]*3 4print(f"calc_list : {calc_list}") 5for i in range(3): 6 for j in range(4): 7 calc_list[i][j] = ( list[i][j] / (list[i][0] + list[i][3]) )*100 8print(f"calc_list : {calc_list}")

実行結果
calc_list : [[80.0, 16.666666666666664, 3.3333333333333335, 20.0], [80.0, 16.666666666666664, 3.3333333333333335, 20.0], [80.0, 16.666666666666664, 3.3333333333333335, 20.0]]

期待する結果 calc_list : [[70.0, 0.20, 0.10, 0.30], [75.0, 0.20, 0.05, 0.25], [66.6666, 16.6666, 3.3333, 33.3333]]

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

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

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

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

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

guest

回答2

0

ベストアンサー

数値計算は numpy を使いましょう。

python

1import numpy as np 2 3a = np.array([[7, 2, 1, 3], [15, 4, 1, 5], [20, 5, 1, 10]]) 4 5s = a[:, 0] + a[:, -1] 6out = a / s[:, np.newaxis] * 100 7print(out) 8# [[70. 20. 10. 30. ] 9# [75. 20. 5. 25. ] 10# [66.66666667 16.66666667 3.33333333 33.33333333]]

解説

1. 最初の列目と最後の列を足す。

python

1s = a[:, 0] + a[:, -1] 2print(s) # [10 20 30]

2. 配列 s の形状を (3,) から (3, 1) にする。

python

1s[:, np.newaxis]
[10 20 30]

[[10] [20] [30]]

3. 除算する際にブロードキャストが行われる。

左辺 a が (3, 4) の配列、右辺 s[:, np.newaxis] が (3, 1) の配列なので、
右辺が (3, 1) -> (3, 4) に broadcast されてから除算される。

[[10] [20] [30]]

array([[10, 10, 10, 10], [20, 20, 20, 20], [30, 30, 30, 30]])

としてから、配列 a と上の配列の要素ごとの除算

4. 除算後に各要素を 100 倍する。

python

1a / s[:, np.newaxis] * 100

division by zero はおこならい (最初の列目+最後の列=0ではない)ことを仮定しています。

zero 除算対策版

最初の列目+最後の列=0となることがある場合は、割れないので値を0とする場合

python

1import numpy as np 2 3a = np.array([[7, 2, 1, 3], [15, 4, 1, 5], [20, 5, 1, 10]], dtype=float) 4 5s = (a[:, 0] + a[:, -1])[:, np.newaxis] 6out = np.divide(a, s, out=np.zeros_like(a), where=s != 0) 7print(out) 8# [[0.7 0.2 0.1 0.3 ] 9# [0.75 0.2 0.05 0.25 ] 10# [0.66666667 0.16666667 0.03333333 0.33333333]]

投稿2019/04/06 07:47

編集2019/04/06 07:54
tiitoi

総合スコア21956

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

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

moto_i

2019/04/06 08:19

回答ありがとうございました。
guest

0

質問文に記載されている処理を, ほぼそのままコードにしてみました。

d.py

python3

1vals = [[7, 2, 1, 3], [15, 4, 1, 5], [20, 5, 1, 10]] 2 3divs = [x[0] + x[-1] for x in vals] 4result = [[e * 100 / divs[idx] for e in vals[idx]] for idx in range(len(divs))] 5 6print(*result, sep="\n")

実行結果

イメージ説明

投稿2019/04/06 13:18

katoy

総合スコア22324

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

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

moto_i

2019/04/07 11:39

回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問