Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用polyfit时,将for循环移动到numpy单个表达式中_Numpy - Fatal编程技术网

调用polyfit时,将for循环移动到numpy单个表达式中

调用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

这里对numpy/python相当陌生,尝试找出一些不太像c、更像numpy的编码风格

背景 我已经完成了一些代码,这些代码使用一组固定的x值和多组对应的y值集,并试图找出哪一组y值是“最线性的”

它通过遍历循环中的每一组y值来实现这一点,计算并存储这些y与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])