多维形状为列表时,Numba函数中的NumPy零不起作用

时间:2019-07-12 06:08:52

标签: python numpy multidimensional-array numba

我试着去尝试一下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能够处理它们,所以我很惊讶。

2 个答案:

答案 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