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

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

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

1272閲覧

【プログラム初心者】配列の標準化

SnowBerryTart

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2019/11/06 10:14

前提・実現したいこと

k-meansでクラスター解析するプログラムを作っています。
その時の各パラメータを標準化するときにエラーが生じました。
大変初心者で初歩的なところを間違えている可能性もあるのですが
どうぞよろしくお願いいたします。

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

27 28 for i in range(3): ---> 29 hoge_array[i] = stdsc.fit_transform(hoge_array[i]) 30 ValueError: Expected 2D array, got 1D array instead: array=[1.085 1.085 1.085 ... 0.576 1.492 1.544]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

該当のソースコード

import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn.externals import joblib from sklearn.preprocessing import StandardScaler #ファイル名とクラスター数の決定 filename = 'hoge.sav' k = 20 #データの読み込み hoge_df = pd.read_csv('cluster_a,b,c.csv') #データの行列化(df⇒array) hoge_array = np.array([hoge_df['a'].tolist(), hoge_df['b'].tolist(), hoge_df['c'].tolist() ], np.float) #データの標準化 stdsc = StandardScaler() for i in range(3): hoge_array[i] = stdsc.fit_transform(hoge_array[i]) #行列の転置 hoge_array = hoge_array.T print(hoge_array)

試したこと

①stdsc.fit_transform(hoge_array[i].reshape(-1,1))
下記のエラーメッセージが表示されました。
could not broadcast input array from shape (2144,1) into shape (2144)

②stdsc.fit_transform(hoge_array[i].reshape(1,-1))
エラーはないのですが、出力が全て0になりました。

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

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

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

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

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

y_waiwai

2019/11/06 11:32

で、しつもんはなんでしょうか
SnowBerryTart

2019/11/06 11:44

返信ありがとうございます。 質問内容と致しましては、標準化を行う際のエラーを解消するにはどうすれば良いかです。 以上よろしくお願い致します。
guest

回答1

0

ベストアンサー

Expected 2D array, got 1D array instead

がほぼすべてです。ループで一行ずつ処理するのをやめればよいかと。

python

1hoge_array = np.array([hoge_df['a'].tolist(), 2 hoge_df['b'].tolist(), 3 hoge_df['c'].tolist() 4 ], np.float) 5 6stdsc = StandardScaler() 7hoge_array = stdsc.fit_transform(hoge_array.T)

投稿2019/11/06 20:18

編集2019/11/06 20:19
hayataka2049

総合スコア30935

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

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

SnowBerryTart

2019/11/07 07:02

ご回答頂き、大変感謝いたします。 示した頂いたコードで上手くいきました。 もしよければ、いいのですが 一行ずつ処理を行う点のどこが悪かったのかご教授願えないでしょうか? また、転置を行ったあとに標準化を行うということは、fit_transformのメソッドがaxis=0に対して処理を行うという認識でよろしいでしょうか? 以上よろしくお願い致します。
hayataka2049

2019/11/07 10:56

> 一行ずつ処理を行う点のどこが悪かったのかご教授願えないでしょうか? 質問文の方法で一行取り出すと配列のndimが減ります。 StandardScalerのfitメソッドには二次元配列を渡す必要があります。これは仕様です。 https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler.fit どうしても一行ずつやるのであれば、 could not broadcast input array from shape (2144,1) into shape (2144) のエラーが出た方は標準化までは成功して、元のnumpy配列に突っ込もうとしている段階でshapeが合わなくて怒られているだけなので、更に結果をarray.reshape(-1)すれば行けるはずです(でもそうとうバカバカしいのでやらなくていい)。 > fit_transformのメソッドがaxis=0に対して処理を行うという認識でよろしいでしょうか? StandardScalerは入力された二次元配列の列を取り出したときに平均0分散1になるように標準化します。
SnowBerryTart

2019/11/08 14:11

丁寧に回答頂き大変ありがとうございますヽ(´▽`)/ 元々二次元配列を渡さないと行けない仕様だったんですね。 そこが全然分かってなかったとこでした。 リファレンスまで示して頂いてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問