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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4621閲覧

pythonでmapとfloat

kohekoh

総合スコア140

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/07/17 14:05

編集2017/07/17 14:39

このようなコードがあり、実行すると
このようなエラーがでます

python

1import numpy as np 2cov = np.zeros((region, 2, 2)) 3sdata = ["[0.2]","[0.3]"] 4cov[0] = np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) 5 6---------------------------------------------------- 7実行結果 8 9float() argument must be a string or a number, 'map'

floatは文字列か数字っていうことなんでしょうが
sdataのなかには文字列がはいっているので通る気がするのですが
どこでエラーになっているのでしょうか
よろしくおねがいします

追記:
このような場合だとどうすればよいでしょうか

python

1for k in range(3): 2 cov[k] = np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) 3

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

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

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

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

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

guest

回答3

0

ベストアンサー

quiquiさんの指摘でバグに気付きました。大変失礼いたしました。
さらに、そもそもsplitがいらないことにも気付いてしまいました...
コードを、それぞれ下記のように読み替えてください。

Python

1import numpy as np 2sdata = ["[0.2]","[0.3]"] 3cov = np.array([float(sdata[i].replace("[","").replace("]","")) for i in range(2)])

Python

1cov = np.array([float(s.replace("[","").replace("]","")) for s in sdata])

ついでに、mapを用いる場合

Python

1def func(str): 2 return float(str.replace("[","").replace("]","")) 3 4cov = np.array(list(map(func, sdata)))

ラムダ式を使うとワンラインで書けますが、ちょっと気持ち悪い感じになります。

以下、元の回答

これなら通ります。

Python

1import numpy as np 2sdata = ["[0.2]","[0.3]"] 3cov = np.array([map(float, sdata[i].replace("[","").replace("]","").split()[0]) for i in range(2)])

splitの返り値がリストだからでしょう。


もし、sdataが6個の要素を持つとしたら...

cov = np.array([map(float, s.replace("[","").replace("]","").split()[0]) for s in sdata])

内包表記は偉大です。

投稿2017/07/17 14:21

編集2017/07/17 15:46
LouiS0616

総合スコア35658

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

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

kohekoh

2017/07/17 14:34

splitの返り値がリストというのはどういうことですか あと、質問のコードが悪かったのですが もし、sdataが6個の要素を持つとしたら このままだと、covに最後と最後から一個前の要素しか入らないのですが それに関してはどうすればいいですか
kohekoh

2017/07/17 14:57

できました! ありがとうございます!
quickquip

2017/07/17 15:14

このソース通りませんよね? エラーになるんですが。 sdata[0].replace("[","").replace("]","").split() #=> ['0.2'] リスト sdata[0].replace("[","").replace("]","").split()[0] #=> '0.2' 文字列 map(float, sdata[0].replace("[","").replace("]","").split()[0]) #=> [float('0'), float('.'), float('1')] で、float('.') がエラーになりませんか? Python3だと、mapオブジェクトを返すので一見通っているように見えますけど、イテレーションの2つ目で エラーになるのでは。
LouiS0616

2017/07/17 15:29

ご指摘ありがとうございます。quiquiさんのおっしゃる通りでした。回答を修正しました。
guest

0

見た感じでpython2系だと思うんですが

In [1]: import numpy as np In [2]: sdata = ["[0.2]","[0.3]"] In [3]: np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) Out[3]: array([[ 0.2], [ 0.3]])

右辺に問題がある感じはしません。
提示するソースを間違えているのではありませんか?

追記は意味がわかりません。「どうすればいいでしょうか?」と聞いてソースを提示していますが、そのように実行したら、その実行した結果になるだけでしょう。
どうなってほしいかを提示するべきです。

投稿2017/07/17 14:55

quickquip

総合スコア11029

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

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

quickquip

2017/07/17 15:15

全体的に、欲しい出力がわからないままで受け答えが進んでいるように見えます。
kohekoh

2017/07/17 15:19

全体的にというのは私の今までの質門が全体的にということですか?
quickquip

2017/07/17 15:25

はい。このページの全体がです。 質問のスクリプトの右辺が np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) の結果が array([[ 0.2], [ 0.3]]) なんですが、これが欲しいものなのかどうか不明なままで進んでいるように見えました。 regionが不明ですが、まぁ2として、 cov = np.zeros((region, 2, 2)) sdata = ["[0.2]","[0.3]"] cov[0] = np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) だと 結果は array([[[ 0.2, 0.2], [ 0.3, 0.3]], [[ 0. , 0. ], [ 0. , 0. ]]]) なのですが、これも欲しいものなのか不明なままです。
kohekoh

2017/07/18 01:57

まず第一に、もともとあるpython2系のコードをpython3系に書き換えながら実行しています 自分の勉強不足なのですが、このコードがpython2系のコードだと思わず(python3系でも動くものだと思っていた) 実行していたので、2系で動かしていたら実行できたのかもしれません ほしいものとしてはquiquiさんがおっしゃっていたものです
quickquip

2017/07/18 02:50

↑が欲しいものだとしたら LouiS0616 さんの回答は括弧が足りない(リストのネストが1段少ない)ですよね。 Python2での右辺 np.array([map(float, sdata[i].replace("[","").replace("]","").split()) for i in range(2)]) の実行結果は array([[ 0.2], [ 0.3]]) で LouiS0616 さんの回答の実行結果は array([ 0.2, 0.3]) です。 cov[0] = で代入するとブロードキャストの次元が違って、結果が変わると思うのですが確認していますか?? そのあたりの曖昧性から 全体的に、欲しい出力がわからないままで受け答えが進んでいるように見えます。 という印象を受けています。
kohekoh

2017/07/18 03:13

本当ですね 自分も他の人のコードを扱っていて、何がほしい出力かというところを曖昧なままに 進めてしまっているようです もとの出力通りにするにはどうすればよろしいでしょうか
quickquip

2017/07/18 04:07

Python2のコードをPython3で動かしていたというのがエラーの原因で、本当の問題は元のソースが回りくどいコードな点にあって、解決策はLouiS0616さんの回答と https://teratail.com/questions/84684 の回答にすべてありますね。
kohekoh

2017/07/18 06:54

いまいちどのようにコードを組めばいいかわかりません LouiS0616さんの回答ではネストが一段足りなくて、 そこを改善できないので、astを用いる段階にいけません
kohekoh

2017/07/18 12:00

なにかヒントを与えていただければうれしいです…
LouiS0616

2017/07/18 12:23

とりあえずfor文で組んでみてはいかがでしょう。 内包表記は慣れが必要なので...
kohekoh

2017/07/18 12:54

いろいろ試して、それでもわからないのでもう一度質問します ありがとうございました
guest

0

[sdata[i].replace("[","").replace("]","").split() for i in range(2)]

の実行結果は

[['0.2'], ['0.3']]

になります。
つまり、listfloatに変換しようとしているのでエラーを吐いています。
split()は不要です。

投稿2017/07/17 14:29

rege

総合スコア38

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

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

kohekoh

2017/07/17 14:38

質問のコードが悪かったのですが もし、sdataが6個の要素を持つとしたら このままだと、covに最後と最後から一個前の要素しか入らないのですが それに関してはどうすればいいですか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問