我正在做以下计算:
y = np.mat(np.log(datay))
x = np.mat([datax**2, datax, np.ones(len(datax))]).T
popt = (x.T * x).I * x.T * y.T
datax 和 datay 是普通的一维 np.array,例如:
datay = np.array([1,4,9,16])
datax = np.array([1,2,3,4])
计算运行良好。但我想加快速度,所以我尝试将其放入 numba 中:(我对 numba 真的很陌生......但想尝试一下)
@jit(nopython=True)
def calc(datax, datay):
y = np.mat(np.log(datay))
x = np.mat([datax**2, datax, np.ones(len(datax))]).T
return (x.T * x).I * x.T * y.T
但这不会运行。我收到以下错误
Failed at nopython (nopython frontend)
Unknown attribute 'matrix' of type Module numpy
那么我怎样才能让它发挥作用呢?
<小时/>第二件事是: 正如您可能注意到的,我正在计算二阶多项式的参数。我需要尽快得到它,因为我需要经常这样做。所以现在我只是循环所有
result = np.zeros(len(datay), 3)
datax = np.array([1,2,3,4)]
x = np.matrix([datax**2, datax, np.ones(len(datax))]).T
for i, data in enumerate(datay):
data = np.array(data-baseline)
if (any(i <= 0 for i in data)): continue
try:
y = np.matrix(np.log(data))
result[i] = ((x.T * x).I * x.T * y.T).A1
我怎样才能加快速度:只需将所有内容放入一个 numba 函数中并希望编译能够完成?或者还有其他聪明的方法吗? numba 有并行化工具吗?它们可以应用于我的情况吗?
感谢您的宝贵时间:)
最佳答案
文档中的以下页面列出了 numba 支持的所有 numpy 功能:
http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html
未列出对 numpy 矩阵对象的支持,因此当前无法在 numba jitted 程序中使用它们。如果您正在做的事情很容易矢量化并且不涉及创建许多中间数组对象,那么从 numba 获得的加速可能会受到限制。您可以尝试从 matrix
切换到 array
数据结构,因为后者受支持。矩阵对象只是有一些稍微不同的行为,因此应该很容易转换代码。
关于python - 带有 numpy 矩阵的 Numba 未运行——未知属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023703/