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

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

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

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

Q&A

解決済

2回答

3573閲覧

二次元リストの列ごとに和を計算したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/06/24 11:25

###やりたいこと
下記の二次元リストにおいて、列ごとに和を計算したいと考えています。
(内包されているリストの個数:11)

イメージ
→1列目の計算
omomiduke[0][0]+omomideke[1][0]+omomiduke[2][0]+omomiduke[3][0]+omomiduke[4][0]+・・・omomideke[10][0]
これを10列分計算したいです。

python3

1omomiduke = [ 2[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], 3[0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.5], 4[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], 5[0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.05555555555555555, 0.5], 6[0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.3333333333333333], 7[0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.06666666666666667, 0.1111111111111111, 0.1111111111111111, 0.1111111111111111, 0.16666666666666666, 0.16666666666666666], 8[0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.16666666666666666, 0.16666666666666666], 9 [0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.16666666666666666, 0.16666666666666666], 10[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], 11[0.25, 0.25, 0.25, 0.25], 12[0.125, 0.125, 0.125, 0.125, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333] 13]

###困っていること
Numpyを使おうとか色々考えたのですが、全くうまくいきません。

ご教授ください。

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

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

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

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

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

tiitoi

2019/06/24 11:28

10行目の [0.25, 0.25, 0.25, 0.25] が4列しかなく、ほかは10列なので、計算できません。
退会済みユーザー

退会済みユーザー

2019/06/26 07:55

ご返信ありがとうございます。 ですよね・・・・。 numpyを使用せずにfor分で要素を全て取り出そうとして失敗してたのですが、numpyでも無理ですよね・・
guest

回答2

0

ベストアンサー

あえてnumpyを使わないでやってみる

python

1from functools import reduce 2 3def add(a1, a2): 4 result = [] 5 for i, e in enumerate(a1): 6 result.append(e + a2[i] if i < len(a2) else e) 7 return result 8 9reduce(add, omomiduke) 10#=> [1.0861111111111112, 1.0861111111111112, 1.0861111111111112, 1.0861111111111112, 0.7944444444444445, 0.8555555555555556, 0.8555555555555556, 0.8555555555555556, 1.0777777777777777, 2.216666666666667]

投稿2019/06/24 12:00

mather

総合スコア6762

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

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

hayataka2049

2019/06/24 12:08

これで from itertools import zip_longest # 中略 結果 = list(map(sum, zip_longest(*omomiduke, fillvalue=0)))
退会済みユーザー

退会済みユーザー

2019/06/26 08:25 編集

@matherさん、@hayataka2049さん、ご回答ありがとうございます! 元々の二次元リストの要素数が異なっていたので計算できないのかなって思っていたのですが、やる方法があるのですね!! 大変勉強になります。ありがとうございます!!
退会済みユーザー

退会済みユーザー

2019/06/26 08:25 編集

@matherさん 挙動について詳しく知りたいので、調べてもわからなかったらこのコードそのものをまた質問するかもしれません。その時、おヒマでしたらまたお願いいたします!
hayataka2049

2019/06/26 08:11

>HORIGUCHIHIROKIさん 計算できるできないというか、とにかく左側の列ほど埋まっていて右に行くにつれて要素がなくなっていくとみなしていいのか、埋まっていない箇所を0とみなしていいのか、といった要件のレイヤの問題がそもそもあります。 上の想定は一番単純(だと思う)なので、matherさんの回答と上の私のコメントはそういう想定のもとで書かれていますが、これは質問者さんの意図しているものと違う結果にもなり得ました。 なので、次回からは曖昧さのないように質問を書いてもらえるといいのかな、と思います。
mather

2019/06/26 08:12

zip_longest いいですね。
mather

2019/06/26 08:20

> 元々の二次元リストの要素数が異なっていたので計算できないのかなって思っていたのですが 懸念している部分があるのであれば、こちらをまず質問に書くべきです。 hayataka2049さんもおっしゃっている通り、要素数が足りないときにはどうやって計算したいのか、という具体的な問題点について何も設定がないため、「左詰め、残りは0とみなす」と仮定せざるを得ませんでした。 聞きたいことは具体的に書いてくださいね。
退会済みユーザー

退会済みユーザー

2019/06/26 08:31

hayataka2049さん、matherさん。ご指摘ありがとうございます。 おっしゃる通り、僕の考えとお2人の仮定が偶然合致していただけでした。 懸念点も質問に書くべきでした。おっしゃる通りです。 回答していただける方に仮定を建てさせてしまうのは、僕が回答者の場合でも嫌なので、身に染みました。 「左詰め、残りは0と見なす」、こちらも記載するべきでした。反省します。
guest

0

numpyを使うならこんな感じですね。

python

1>>> import numpy as np 2>>> a = np.arange(9).reshape(3, 3) 3>>> a 4array([[0, 1, 2], 5 [3, 4, 5], 6 [6, 7, 8]]) 7>>> a.sum(axis=0) 8array([ 9, 12, 15])

あくまでも標準の機能で処理する場合は、zip, sum, mapを組み合わせて使うと簡単でしょう。

python

1>>> a = a.tolist() 2>>> a 3[[0, 1, 2], [3, 4, 5], [6, 7, 8]] 4>>> list(map(sum, zip(*a))) 5[9, 12, 15]

処理の流れのイメージとしては、
0. zipで転置する
0. 転置したものに対してmapsumで行ごとに総和を取る
0. listに変換しておく

という感じです。

投稿2019/06/24 11:39

編集2019/06/24 11:40
hayataka2049

総合スコア30939

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

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

退会済みユーザー

退会済みユーザー

2019/06/26 07:57

ご回答ありがとうございます。 そうですね。numpyを使用する為の過程において、勉強したことを再確認できそうです。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問