web-dev-qa-db-ja.com

TypeError:指数関数的にデータをフィットさせようとしている間、長さ-1の配列のみがPythonスカラに変換できます

f=np.loadtxt('Single Small Angle 1.txt',unpack=True,skiprows=2)
g=np.loadtxt('Single Small Angle 5.txt',unpack=True,skiprows=2)

x = f-g[:,:11944]
t=range(len(x))
m=math.log10(abs(x))

np.polyfit(t,m)

plt.plot(t,abs(x))
plt.show()

問題の解決方法がわからないだけです。それは言い続けます:

m=math.log10(abs(x))
TypeError: only length-1 arrays can be converted to Python scalars
68
user3291404

math.abs()math.log10()のような派手でない関数は、派手な配列ではうまく動きません。エラーが発生している行を以下のように置き換えるだけです。

    m = np.log10(np.abs(x))

それとは別に、np.polyfit()呼び出しはパラメータを欠いているので動作しません(そしてそれ以上の使用のために結果を代入していません)。

92
Tom Pohl

Python2.7でこのエラーをテンキーで再現するもう1つの方法があります。

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate(a,b)   #note the lack of Tuple format for a and b
print(c) 

np.concatenateメソッドはエラーを生成します。

TypeError: only length-1 arrays can be converted to Python scalars

numpy.concatenate についてのドキュメントを読んでいるのであれば、それはnumpy配列オブジェクトのTupleを必要としているのがわかります。そのため、変数を親で囲むことで修正しました。

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate((a,b))  #surround a and b with parens, packaging them as a Tuple
print(c) 

それからそれは印刷します:

[1 2 3 4 5 6]

ここで何が起きているのですか?

そのエラーはバブルアップ実装のケースです - それはpythonのアヒルタイプ哲学によって引き起こされます。これは不可解な低レベルのエラーです。予期しない変数型を受け取り、実行しようとし、途中で失敗し、修正措置を試み、失敗した後、失敗したことを報告します火曜日に東から風が吹いたときに部分空間レスポンダを再定式化します "。

C++やJavaのようなもっと賢明な言語では、 "TypeBが期待されている場所ではTypeAを使うことはできない"とあなたに言ったでしょう。しかし、Pythonは兵士に最善を尽くし、未定義のことをし、失敗し、そして役に立たないエラーを返します。私たちがこれについて議論しなければならないという事実は、私がPythonが好きではない理由の1つ、またはそのアヒルタイピング哲学です。

60
Eric Leschinski