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

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

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

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

Q&A

解決済

1回答

1012閲覧

Pythonで標準化のプログラムを作成しています。

peyang

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2019/09/17 08:59

前提・実現したいこと

Python初心者です。
標準化のプログラムを作成しています。
1.ファイル名を標準入力で受け取り
2.ファイルの各列を標準化
3.結果を新しいcsvファイルに出力
といった流れを考えています。
エラーの意味が分からず、解決策をご提示いただけないでしょうか。
何卒、よろしくお願いいたします。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "std_new.py", line 19, in <module> x = data[:,i] IndexError: index 4 is out of bounds for axis 1 with size 4

該当のソースコード

Python

1import numpy as np 2import csv 3 4def standardize(x): 5 x_mean = x.mean() 6 std = x.std() 7 8 return(x - x_mean)/std 9 10filename = input("ファイル名を入力してください:") 11 12data = np.loadtxt(fname=filename, 13 dtype = 'double', 14 delimiter = ',', 15 skiprows = 1 16 ) 17 18for i in range(len(data)): 19 x = data[:,i] 20 standardize_x = standardize(x) 21 22standardize_x = csv.writer('std_result.csv')

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

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

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

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

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

guest

回答1

0

ベストアンサー

列数を取得したい場合、以下のようにするべきではないでしょうか。

diff

1- for i in range(len(data)): 2+ for i in range(data.shape[1]):

追記

python

1import numpy as np 2import csv 3 4 5def standardize(x): 6 mean = x.mean() 7 std = x.std() 8 9 return (x - mean) / std 10 11 12data = np.loadtxt("sample.csv", delimiter=",", skiprows=1) 13 14 15normalized = np.empty_like(data) 16 17for i in range(data.shape[1]): 18 normalized[:, i] = standardize(data[:, i]) 19 20np.savetxt("normalized.csv", normalized, delimiter=",")

投稿2019/09/17 09:01

編集2019/09/17 09:50
tiitoi

総合スコア21956

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

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

peyang

2019/09/17 09:33

ご回答ありがとうございます。 shapeに変更し、書き込みのところをsavetxtに変更したら正しく実行されました。 但し、入力のcsvが4列であったのに対して、出力結果が最後の列のみでした。 for文の中で上書きしてしまっているのだと思います。 別の列にそれぞれ格納できるよう改良を加える必要があるようです。 少しあがいてみます。
tiitoi

2019/09/17 09:51

normalized = np.empty_like(data) で data と同じ大きさの配列を作って、標準化した列の結果を同じ列に代入すればいいかと思います。 コードを追記しました。
peyang

2019/09/17 10:25

納得いきました。コードのご提示までしていただきありがとうございます。 この方法ならfor文の中で順次データを配列に格納することができました。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問