我试着去尝试一下numba,因为有人告诉我它对于数值/科学计算应用程序非常有效。但是,在以下情况下,我似乎已经遇到了问题:
我有一个函数,该函数计算一个由numpy数组表示的12x12雅可比矩阵,然后返回此雅可比矩阵。但是,当我尝试用@numba.njit
装饰所说的函数时,出现以下错误:
这通常不是Numba本身的问题,而通常是由 使用不受支持的功能或解决类型问题。
作为我的用法的基本示例,以下代码尝试声明一个12x12 numpy零矩阵,但失败:
import numpy as np
import numba
@numba.njit
def numpy_matrix_test():
A = np.zeros([12,12])
return A
A_out = numpy_matrix_test()
print(A_out)
由于我假设以这种方式声明numpy数组已经足够普遍,以至于numba能够处理它们,所以我很惊讶。
答案 0 :(得分:1)
假设numba jitted函数中调用的函数与未在numba函数中使用的函数相同,这一假设实际上是错误(但可以理解)。实际上,numba(在幕后)将委托给自己的函数,而不是使用“真正的” NumPy函数。
因此,在jitted函数中并不是真正调用的np.zeros
,而是their own function。因此,Numba和NumPy之间的某些差异是不可避免的。
例如,您不能使用形状的列表,它必须是元组(列表和数组会产生您遇到的异常)。因此正确的语法为:
@numba.njit
def numpy_matrix_test():
A = np.zeros((12, 12))
return A
类似的情况适用于dtype参数。它必须是 real NumPy / numba类型,不能使用Python类型:
@numba.njit
def numpy_matrix_test():
A = np.zeros((12, 12), dtype=int) # to make it work use numba.int64 instead of int here
return A
即使“普通”的NumPy允许它:
np.zeros((12, 12), dtype=int)
答案 1 :(得分:0)
您是否要表示numpy.zeros((12,12)),因为您想要12行12列的形状? Numpy Zeros reference