Matplotlib:TypeError:不能将序列乘以“numpy.float64"类型的非整数 [英] Matplotlib: TypeError: can't multiply sequence by non-int of type 'numpy.float64'

查看:42
本文介绍了Matplotlib:TypeError:不能将序列乘以“numpy.float64"类型的非整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将最适合我的 matplotlib 图的线性线拟合.我不断收到 x 和 y 没有相同第一维的错误.但它们的长度都是 15.我做错了什么?

I am trying to fit a linear line of best fit to my matplotlib graph. I keep getting the error that x and y do not have the same first dimension. But they both have lengths of 15. What am I doing wrong?

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)
~AppDataLocalTemp/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'

推荐答案

你应该制作 xy numpy 数组,而不是列表:

You should make x and y numpy arrays, not lists:

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.

With this change, it produces the expected plot. If they are lists, m * x will not produce the result you expect, but an empty list. Note that m is anumpy.float64 scalar, not a standard Python float.

我实际上认为这是 Numpy 的一个有点可疑的行为.在普通 Python 中,将列表与整数相乘只是重复列表:

I actually consider this a bit dubious behavior of Numpy. In normal Python, multiplying a list with an integer just repeats the list:

In [42]: 2 * [1, 2, 3]
Out[42]: [1, 2, 3, 1, 2, 3]

将列表与浮点数相乘会出现错误(我认为应该如此):

while multiplying a list with a float gives an error (as I think it should):

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 标量相乘显然是有效的:

The weird thing is that multiplying a Python list with a Numpy scalar apparently works:

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]

因此似乎浮点数被截断为整数,之后您将获得重复列表的标准 Python 行为,这是非常出乎意料的行为.最好的办法是提出错误(这样您就可以自己发现问题,而不必在 Stackoverflow 上提出问题)或仅显示预期的元素乘法(您的代码将在其中工作).有趣的是,列表和 Numpy 标量之间的加法确实有效:

So it seems that the float gets truncated to an int, after which you get the standard Python behavior of repeating the list, which is quite unexpected behavior. The best thing would have been to raise an error (so that you would have spotted the problem yourself instead of having to ask your question on Stackoverflow) or to just show the expected element-wise multiplication (in which your code would have just worked). Interestingly, addition between a list and a Numpy scalar does work:

In [69]: np.float64(0.123) + [1, 2, 3]
Out[69]: array([ 1.123,  2.123,  3.123])

这篇关于Matplotlib:TypeError:不能将序列乘以“numpy.float64"类型的非整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆