🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

1573閲覧

リストの要素を平均かして要素数を減らしたい

shield

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2021/02/17 08:30

CSV形式で出力される測定データをリスト化してグラフに出力したいのですが、データ数が多くグラフかする処理に時間がかかっています。
例えばこのようなリストがある場合
[1,2,3,4,5,6,7,8,9]
3ずつ平均化して
[2,5,8]
の様なリストにしたいのですが、平均化だとすべてを平均化するような例しか見つからなかったため質問させていただきました。

以下の様なコードでグラフ化しています。

python

1import pandas as pd 2import openpyxl 3import matplotlib.pyplot as plt 4 5# CSVファイルの読み込み 6col_names = ['c{0:02d}'.format(i) for i in range(5)] 7data = pd.read_csv('file.csv',encoding="utf-8", names = col_names) 8 9# Excel形式で出力 10data.to_excel('data.xlsx', encoding='utf-8') 11 12wb = openpyxl.load_workbook("data.xlsx") 13sheet = wb.active 14 15#リスト化 16time_list = [] 17for row in range(8,sheet.max_row+1): 18 for col in range(2,3): 19 time_list.append(sheet.cell(row,col).value) 20amp_list = [] 21for row in range(8,sheet.max_row+1): 22 for col in range(4,5): 23 amp_list.append(sheet.cell(row,col).value) 24# グラフ描画 25plt.scatter(time_list,amp_list) 26plt.show() 27

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

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

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

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

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

guest

回答2

0

ベストアンサー

素直に実装すると

Python

1def n_mean(ls, n): 2 return [sum(ls[i-n+1:i+1])/n for i in range(n-1,len(ls),n)] 3 4n_mean([1,2,3,4,5,6,7,8,9], 3) # [2.0, 5.0, 8.0] 5 6time_list = n_mean(time_list, 3) 7amp_list = n_mean(amp_list, 3) 8plt.scatter(time_list,amp_list) 9plt.show()

n 個の平均を取る仕様が曖昧なのでどちらがいいかわかりませんが n 個ずつにした余りを無視して
n_mean([1,2,3,4,5,6,7,8,9,10], 3) を [2.0, 5.0, 8.0] としたい場合は

Python

1def n_mean(ls, n): 2 return [sum(ls[i-n+1:i+1])/n for i in range(n-1,len(ls),n)]

n 個に満たないものも n で割った平均値にして
n_mean([1,2,3,4,5,6,7,8,9,10], 3) を [2.0, 5.0, 8.0, 3.333...] としたい場合は

Python

1def n_mean(ls, n): 2 return [sum(ls[i:i+n])/n for i in range(0,len(ls),n)]

n 個に満たない余ったものを余った個数で平均して
n_mean([1,2,3,4,5,6,7,8,9,10], 3) を [2.0, 5.0, 8.0, 10.0] としたい場合は

Python

1def n_mean(ls, n): 2 ln = len(ls) 3 return [sum(ls[i:i+n])/(n if i+n <= ln else ln-i) for i in range(0, ln, n)]

投稿2021/02/17 09:14

編集2021/02/17 10:49
lehshell

総合スコア1156

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

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

ppaul

2021/02/17 09:53

好みの問題かもしれませんが、 return [sum(ls[i:i+n])/n for i in range(0,len(ls),n)] の方が読みやすいと思いました。
lehshell

2021/02/17 10:04

ごもっともです。 センス悪かった。修正します。
lehshell

2021/02/17 10:30

元のコードにした意図を思い出して処理の違いを示しました。
shield

2021/02/18 00:59

非常に丁寧にご回答いただきありがとうございました。
guest

0

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

python

1import numpy as np 2 3def n_mean(numbers, n): 4 if len(numbers) % n != 0: 5 print("error") 6 raise ValueError 7 return list(np.mean(np.array(numbers).reshape(len(numbers)//n, n), axis=1))

実行例

python

1>>> n_mean([1,2,3,4,5,6,7,8,9], 3) 2[2.0, 5.0, 8.0] 3>>> n_mean([1,2,3,4,5,6,7,8,9,10], 2) 4[1.5, 3.5, 5.5, 7.5, 9.5]

投稿2021/02/17 09:03

ppaul

総合スコア24670

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

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

shield

2021/02/18 00:59

非常に丁寧にご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問