调用polyfit时,将for循环移动到numpy单个表达式中
这里对numpy/python相当陌生,尝试找出一些不太像c、更像numpy的编码风格 背景 我已经完成了一些代码,这些代码使用一组固定的x值和多组对应的y值集,并试图找出哪一组y值是“最线性的” 它通过遍历循环中的每一组y值来实现这一点,计算并存储这些y与x的直线拟合的残差,然后一旦循环找到最小残差值的索引 …很抱歉,使用下面的代码可能会更有意义调用polyfit时,将for循环移动到numpy单个表达式中,numpy,Numpy,这里对numpy/python相当陌生,尝试找出一些不太像c、更像numpy的编码风格 背景 我已经完成了一些代码,这些代码使用一组固定的x值和多组对应的y值集,并试图找出哪一组y值是“最线性的” 它通过遍历循环中的每一组y值来实现这一点,计算并存储这些y与x的直线拟合的残差,然后一旦循环找到最小残差值的索引 …很抱歉,使用下面的代码可能会更有意义 import numpy as np import numpy.polynomial.polynomial as poly # set of x
import numpy as np
import numpy.polynomial.polynomial as poly
# set of x values
xs = [1,22,33,54]
# multiple sets of y values for each of the x values in 'xs'
ys = np.array([[1, 22, 3, 4],
[2, 3, 1, 5],
[3, 2, 1, 1],
[34,23, 5, 4],
[23,24,29,33],
[5,19, 12, 3]])
# array to store the residual from a linear fit of each of the y's against x
residuals = np.empty(ys.shape[0])
# loop through the xs's and calculate the residual of a linear fit for each
for i in range(ys.shape[0]):
_, stats = poly.polyfit(xs, ys[i], 1, full=True)
residuals[i] = stats[0][0]
# the 'most linear' of the ys's is at np.argmin:
print('most linear at', np.argmin(residuals))
问题:
我想知道是否有可能将其“numpy'ize”成一个单独的表达式,比如
残差=获取残差(xs,ys)
…我试过:
我尝试了以下方法,但没有成功(它总是传入完整数组,而不是逐行传入):
#----好的,不要循环--------
def包裹(x,y):
_,stats=poly.polyfit(x,y,1,full=True)
返回统计信息[0][0]
res=从包装(xs,ys)#(不要与不可交换的numpy.polyfit
混淆)
:
x:阵列_形,形状(M)
y:类似数组的形状(M,)或(M,K)
您的ys
需要转换为ys.shape[0]
等于xs.shape
def wrap(x, y):
_, stats = poly.polyfit(x, y.T, 1, full=True)
return stats[0]
res = wrap(xs, ys)
res
Out[]: array([284.57337884, 5.54709898, 0.41399317, 91.44641638,
6.34982935, 153.03515358])
啊。。。这就是我工作太晚的原因——我应该再看一遍这些文件。。。谢谢你,丹尼尔!但是,我不知道您使用的是哪个numpy版本,在1.16.2中,函数的第一行会产生一个值错误,因为np。如果full
为True
,polyfit
将返回五个元素的元组。此外,为什么要定义一个只调用另一个函数的函数?您可以轻松地直接调用polyfit
。不需要包装器。@MaxPowers我的版本是1.17.3,但我认为多年来polyfit的功能变化不大(最初认为asker需要更新numpy
,所以我检查了)@MaxPowers 1.16的文档也显示了2元组输出,而不是5元组输出。我不知道你那边出了什么问题。谢谢你的检查。和之间有一个明显的区别,这是我输入的,我没有意识到。
def wrap(x, y):
_, stats = poly.polyfit(x, y.T, 1, full=True)
return stats[0]
res = wrap(xs, ys)
res
Out[]: array([284.57337884, 5.54709898, 0.41399317, 91.44641638,
6.34982935, 153.03515358])