pythonnumpy(v1.15.0)无法拟合抛物线

pythonnumpy(v1.15.0)无法拟合抛物线,python,numpy,polynomial-approximations,Python,Numpy,Polynomial Approximations,我很难理解为什么numpy很难用抛物线来拟合这些数据 def make_poly(x, coefs): # generate a polynomial from an array of coefficients f = numpy.zeros(len(x)) for i in range(len(coefs)): f = f + coefs[-1-i]*x**i return(f) xx = [1443.56, 1443.56, 1450.83

我很难理解为什么numpy很难用抛物线来拟合这些数据

def make_poly(x, coefs):
    # generate a polynomial from an array of coefficients
    f = numpy.zeros(len(x))
    for i in range(len(coefs)):
        f = f + coefs[-1-i]*x**i
    return(f)


xx = [1443.56, 1443.56, 1450.83, 1447.59, 1454.9, 1434.77, 1423.74, 1426.87, 1438.75, 1447.59, 1454.9, 1444.36, 1454.9, 1426.09, 1454.08, 1453.27, 1447.59, 1449.2, 1451.64, 1454.08, 1454.08, 1454.9, 1454.9, 1455.71, 1452.45, 1450.01, 1453.27, 1430.81, 1454.9, 1448.39, 1432.39, 1452.45, 1445.16, 1431.6, 1447.59, 1447.59, 1425.3, 1443.56, 1453.27, 1424.52, 1429.23, 1421.4, 1454.08, 1445.97, 1427.66, 1429.23, 1433.18, 1430.81, 1440.35,1429.23]

yy = [120.15, 120.15, 123.09, 122.07, 123.52, 116.35, 104.75, 108.34, 119.13, 122.07, 124.27, 120.29, 124.27, 106.6, 124.27, 124.13, 122.07, 122.2,  122.34, 123.37, 124.27, 124.27, 124.27, 124.41, 122.34, 122.2,  123.24, 111.95, 124.27, 121.31, 113.71, 123.24, 121.18, 113.71, 121.31, 122.07, 106.6,  121.04, 124.13, 105.61, 110.96, 100.31, 123.37, 121.18, 109.21, 111.83, 114.58, 112.83, 118.38, 110.96]

fit_result = numpy.polyfit(x=xx, y=yy, deg=2, full=True)
newX = numpy.linspace(1420, 1460, 100)
pyplot.scatter(xx, yy)
pyplot.plot(newX, make_poly(newX, fit_result[0]), 'g', linewidth =.5)
pyplot.show()
运行此命令还会抛出以下消息:

Python(35100,0x7fff9cda3380) malloc: *** mach_vm_map(size=18446744072151506944) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
init_dgelsd failed init

我在操作系统High Sierra、Python 3.7.0、numpy 1.15.0(使用自制软件安装)上运行此功能

您的代码对我来说很有吸引力,可以生成以下输出(
版本:3.6.1 | Anaconda 4.4.0(x86_64)
。顺便说一句,创建多项式不需要附加函数
make\u poly
NumPy
已经为您提供了
poly1d
。以下不带
make\u poly
的缩短代码的工作方式相同:

fit_result = np.polyfit(xx, yy, 2)
fit_eq = np.poly1d(fit_result)
newX = np.linspace(1420, 1460, 100)
plt.scatter(xx, yy)
plt.plot(newX, fit_eq(newX), 'g', linewidth =.5)

示例中提供的代码运行良好。 因此,我认为问题在于包版本状态。 可能要修复错误,您必须确保您使用的wheel、setuptools和pip+软件包是最新的。为此,请使用以下命令:

pip install --upgrade pip setuptools wheel
pip install -I numpy matplotlib # + Other packages.
完成安装后,请重试。如果错误仍然存在,请使用您正在使用的python版本和软件包扩展问题(因此它将变得可复制)

更新:


上面的答案已经解决了这个问题,特别是将numpy从
1.15.0
升级到
1.15.1

在Google上搜索
init\u dgelsd
时出现了以下错误报告:

你可以跑

import numpy
numpy.test('full')
…运行NumPy的内置测试套件,看看它是否返回任何问题

莫伊卡·米克拉维奇:

显然不是

sudo端口安装py37 numpy+gcc7

sudo端口安装py37 numpy+gcc8

修复了这个问题,但最好在盲目更改默认值之前找出原因


您的代码正常工作,这是我在我的机器上得到的输出您的输出是预期的。在将numpy从1.15.0升级到1.15.1之后,它在我的机器上也正常工作。复制/粘贴这给了我一个错误:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()完整消息:fit_eq=numpy.poly1d(fit_result)文件“/usr/local/lib/python3.7/site packages/numpy/lib/polymon.py”,第1090行,在init c_或_r=trim_zeros(c_或_r,trim='f')文件“/usr/local/lib/python3.7/site packages/numpy/lib/function_base.py”,第1484行,如果i!=0,则在trim_zero中。:ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()你有什么版本的NumPy?在发布问题1.15.0之前和升级1.15.1之后,使用
poly1d
在将
fit_eq
更改为
fit_eq[0]后工作
@DusanKojic谢谢你让我知道:)你想让我把它包括在回答中吗?是的,谢谢。我把评论移到了帖子下面,以便更好地看到。