我有两个具有以下值的数组:
>>> x = [24.0, 13.0, 12.0, 22.0, 21.0, 10.0, 9.0, 12.0, 7.0, 14.0, 18.0,
... 1.0, 18.0, 15.0, 13.0, 13.0, 12.0, 19.0, 13.0]
>>> y = [10.0, 9.0, 22.0, 7.0, 4.0, 7.0, 56.0, 5.0, 24.0, 25.0, 11.0, 2.0,
... 9.0, 1.0, 9.0, 12.0, 9.0, 4.0, 2.0]
我使用scipy库来计算r平方:
>>> from scipy.interpolate import polyfit
>>> p1 = polyfit(x, y, 1)
当我运行以下代码时:
>>> yfit = p1[0] * x + p1[1]
>>> yfit
array([], dtype=float64)
yfit
数组为空。我不明白为什么。
答案 0 :(得分:2)
问题是您使用空list
执行scalar addition。
您有一个空list
的原因是因为您尝试使用python列表而不是numpy.array
执行标量乘法。标量将转换为整数0
,并创建零长度list
。
我们将在下面进行探讨,但为了解决这个问题,您只需要在numpy数组中而不是在列表中使用数据。最初创建它,或将列表转换为数组:
>>> x = numpy.array([24.0, 13.0, 12.0, 22.0, 21.0, 10.0, 9.0, 12.0, 7.0, 14.0,
... 18.0, 1.0, 18.0, 15.0, 13.0, 13.0, 12.0, 19.0, 13.0]
对正在发生的事情的解释如下:
让我们解压缩表达式yfit = p1[0] * x + p1[1]
。
组成部分是:
>>> p1[0]
-0.58791208791208893
p1[0]
不是浮点数,但它是numpy
数据类型:
>>> type(p1[0])
<class 'numpy.float64'>
x
如上所述。
>>> p1[1]
20.230769230769241
与p1[0]
类似,p1[1]
的类型也是numpy.float64
:
>>> type(p1[0])
<class 'numpy.float64'>
将列表乘以非整数将数字插值为整数,p1[0]
-0.58791208791208893
变为0
:
>>> p1[0] * x
[]
作为
>>> 0 * [1, 2, 3]
[]
最后,您要将空列表添加到p[1]
,这是一个numpy.float64
。
这不会尝试将值附加到空列表。它执行scalar addition,即它将20.230769230769241
添加到列表中的每个条目。
但是,由于列表为空,因此除了返回类型为numpy
的空array
numpy.float64
之外没有任何效果:
>>> [] + p1[1]
array([], dtype=float64)
具有效果的标量添加的示例:
>>> [10, 20, 30] + p1[1]
array([ 30.23076923, 40.23076923, 50.23076923])