【发布时间】:2019-10-10 13:34:51
【问题描述】:
我正在进行数据分析,其中涉及最小化一组点和一组相应的正交函数之间的最小二乘误差。换句话说,我正在获取一组 y 值和一组函数,并尝试将 x 值归零,以使所有函数最接近其对应的 y 值。一切都在“data_set”类中完成。我要比较的函数都存储在一个列表中,并且我使用类方法来计算所有函数的总 lsq-error:
self.fits = [np.poly1d(np.polyfit(self.x_data, self.y_data[n],10)) for n in range(self.num_points)]
def error(self, x, y_set):
arr = [(y_set[n] - self.fits[n](x))**2 for n in range(self.num_points)]
return np.sum(arr)
当我的时间比数据多得多时,这很好,但现在我正在获取数千个 x 值,每个都有一千个 y 值,而 for 循环的速度慢得令人无法接受。我一直在尝试使用np.vectorize:
#global scope
def func(f,x):
return f(x)
vfunc = np.vectorize(func, excluded=['x'])
…
…
#within data_set class
def error(self, x, y_set):
arr = (y_set - vfunc(self.fits, x))**2
return np.sum(arr)
只要n 有效,func(self.fits[n], x) 就可以正常工作,据我所知,docs,vfunc(self.fits, x) 应该相当于
[self.fits[n](x) for n in range(self.num_points)]
但它会抛出:
ValueError: cannot copy sequence with size 10 to array axis with dimension 11
10 是多项式拟合的次数,11 是(根据定义)其中的项数,但我不知道它们为什么会出现在这里。如果我更改配合顺序,错误消息会反映更改。似乎np.vectorize 将self.fits 的每个元素作为一个列表而不是np.poly1d 函数。
无论如何,如果有人可以帮助我更好地理解np.vectorize,或者提出另一种消除该循环的方法,那就太好了。
【问题讨论】:
-
np.vectorize不会让事情变得更快。如果我记得早期的 SO,它的excluded=['x']仅在x是关键字参数时才有效。所以它不仅比普通迭代慢,而且更难正确使用。仅当您针对另一个输入参数广播一个输入参数时,它才有用。
标签: python-3.x numpy vectorization