python numpy (v1.15.0) 无法拟合抛物线
python numpy (v1.15.0) fails to fit parabola
我无法理解为什么 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
我是 运行 OS High Sierra,Python 3.7.0,numpy 1.15.0(使用自制软件安装)。
你的代码对我来说就像一个魅力,产生了以下输出(Version:3.6.1 |Anaconda 4.4.0 (x86_64)
。顺便说一下,你不需要额外的函数 make_poly
来创建多项式。NumPy
已经为您提供了 poly1d
。以下没有 make_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_dgelsd
会出现此错误报告:py-numpy: numpy.polyfit broken with +gfortran variant on High Sierra。
你可以运行
import numpy
numpy.test('full')
...到 运行 NumPy 的内置测试套件,看看它 returns 是否有任何问题。
Mojca Miklavec suggests:
Apparently either
sudo port install py37-numpy +gcc7
or
sudo port install py37-numpy +gcc8
fixed the problem, but it would be ideal to figure out why exactly before blindly changing the default.
我无法理解为什么 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
我是 运行 OS High Sierra,Python 3.7.0,numpy 1.15.0(使用自制软件安装)。
你的代码对我来说就像一个魅力,产生了以下输出(Version:3.6.1 |Anaconda 4.4.0 (x86_64)
。顺便说一下,你不需要额外的函数 make_poly
来创建多项式。NumPy
已经为您提供了 poly1d
。以下没有 make_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_dgelsd
会出现此错误报告:py-numpy: numpy.polyfit broken with +gfortran variant on High Sierra。
你可以运行
import numpy
numpy.test('full')
...到 运行 NumPy 的内置测试套件,看看它 returns 是否有任何问题。
Mojca Miklavec suggests:
Apparently either
sudo port install py37-numpy +gcc7
or
sudo port install py37-numpy +gcc8
fixed the problem, but it would be ideal to figure out why exactly before blindly changing the default.