[解決済み] Matplotlib: TypeError: 'numpy.float64' 型の非インテムをシーケンスに掛けることはできません。
2022-03-03 08:54:39
質問
matplotlibのグラフに最適解の直線をあてはめようとしています。x と y は同じ 1 次元を持っていないというエラーが出続けます。しかし、両方とも長さが15です。私は何を間違えているのでしょうか?
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
x = [0.46,0.59,0.68,0.99,0.39,0.31,1.09,0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78]
y = [0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,0.478,0.335,0.365,0.424,0.390,0.585,0.511]
xerr = [0.01]*15
yerr = [0.001]*15
plt.rc('font', family='serif', size=13)
m, b = np.polyfit(x, y, 1)
plt.plot(x,y,'s',color='#0066FF')
plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE
plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black')
plt.xlabel('$\Delta t$ $(s)$',fontsize=20)
plt.ylabel('$\Delta p$ $(hPa)$',fontsize=20)
plt.autoscale(enable=True, axis=u'both', tight=False)
plt.grid(False)
plt.xlim(0.2,1.2)
plt.ylim(0,0.8)
plt.show()
エラー
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_34116/1820029981.py in <module>
7 m, b = np.polyfit(x, y, 1)
8 plt.plot(x,y,'s',color='#0066FF')
----> 9 plt.plot(x, m*x + b, 'r-') #BREAKS ON THIS LINE
10 plt.errorbar(x,y,xerr=xerr,yerr=0,linestyle="None",color='black')
11 plt.xlabel('$\Delta t$ $(s)$',fontsize=20)
TypeError: can't multiply sequence by non-int of type 'numpy.float64'
解決方法は?
を作成する必要があります。
x
と
y
リストではなく、numpyの配列です。
x = np.array([0.46,0.59,0.68,0.99,0.39,0.31,1.09,
0.77,0.72,0.49,0.55,0.62,0.58,0.88,0.78])
y = np.array([0.315,0.383,0.452,0.650,0.279,0.215,0.727,0.512,
0.478,0.335,0.365,0.424,0.390,0.585,0.511])
この変更により、期待通りのプロットが生成されます。もしそれらがリストであれば
m * x
を実行すると、期待した結果にはならず、空のリストが生成されます。なお
m
は
numpy.float64
スカラーであり、Pythonの標準的な
float
.
実はこれ、Numpyのちょっと怪しげな動作だと思っているんです。通常のPythonでは、リストと整数の掛け算は、リストを繰り返すだけです。
In [42]: 2 * [1, 2, 3]
Out[42]: [1, 2, 3, 1, 2, 3]
を実行するとエラーが発生します。
In [43]: 1.5 * [1, 2, 3]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-43-d710bb467cdd> in <module>()
----> 1 1.5 * [1, 2, 3]
TypeError: can't multiply sequence by non-int of type 'float'
不思議なのは、PythonのリストとNumpyのスカラーを掛け合わせると、どうやらうまくいくらしいことです。
In [45]: np.float64(0.5) * [1, 2, 3]
Out[45]: []
In [46]: np.float64(1.5) * [1, 2, 3]
Out[46]: [1, 2, 3]
In [47]: np.float64(2.5) * [1, 2, 3]
Out[47]: [1, 2, 3, 1, 2, 3]
つまり、floatが切り捨てられintになり、その後、リストを繰り返すというPythonの標準的な動作になるようですが、これは非常に予想外の動作です。一番いいのは、エラーを出すか(そうすればStackoverflowで質問する代わりに自分で問題を発見できたでしょう)、期待通りの要素ごとの乗算を表示すること(そうすればあなたのコードはうまくいったでしょう)でしょう。興味深いことに、リストとNumpyのスカラーとの足し算はうまくいくのです。
In [69]: np.float64(0.123) + [1, 2, 3]
Out[69]: array([ 1.123, 2.123, 3.123])
関連
-
Python入門 openを使ったファイルの読み書きの方法
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] TypeError: シーケンスアイテム 0: 予想される文字列、int が見つかりました。
-
[解決済み] TypeError: can't multiply sequence by non-int of type 'float'」と表示されるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】ValueError: xとyは同じサイズでなければならない