在numba函数中将np.min与列表输入一起使用

时间:2019-03-03 18:41:03

标签: python list numpy numba

在这里使用np.min有什么问题? numba为什么不喜欢在该函数中使用列表,还有其他方法可以使np.min工作吗?

from numba import njit
import numpy as np

@njit
def availarray(length):
    out=np.ones(14)
    if length>0:
        out[0:np.min([int(length),14])]=0
    return out

availarray(3)

该功能可以在min上正常工作,但是np.min应该更快...

2 个答案:

答案 0 :(得分:3)

问题是np.min的数字版本需要输入array

from numba import njit
import numpy as np

@njit
def test_numba_version_of_numpy_min(inp):
    return np.min(inp)

>>> test_numba_version_of_numpy_min(np.array([1, 2]))  # works
1

>>> test_numba_version_of_numpy_min([1, 2]) # doesn't work
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<function amin at 0x000001B5DBDEE598>) with argument(s) of type(s): (reflected list(int64))
 * parameterized
In definition 0:
    All templates rejected with literals.
In definition 1:
    All templates rejected without literals.
This error is usually caused by passing an argument of a type that is unsupported by the named function.

更好的解决方案是只使用numba版本的Python min

from numba import njit
import numpy as np

@njit
def availarray(length):
    out = np.ones(14)
    if length > 0:
        out[0:min(length, 14)] = 0
    return out

由于np.minmin实际上都是这些函数的Numba版本(至少在njit ted函数中),因此min在这种情况下也应该更快。但是,这不太可能引起注意,因为数组的分配和将某些元素设置为零将是此处的主要运行时贡献者。

请注意,您甚至不需要在这里进行min调用-因为即使使用更大的stop索引,切片也会隐式停止在数组的末尾:

from numba import njit
import numpy as np

@njit
def availarray(length):
    out = np.ones(14)
    if length > 0:
        out[0:length] = 0
    return out

答案 1 :(得分:0)

要使您的代码与<form class="form-horizontal"> <div class="form-group"> <label for="ClientID">Client Id</label> <div class="col-sm-4"> <input required type="text"> </div> </div> <div class="form-group"> <label for="ClientID">Employee Id</label> <div class="col-sm-4"> <input required type="text"> </div> </div> </form> 一起使用,您必须在NumPy数组上应用numba,这意味着您必须将列表np.min转换为NumPy数组,如下所示< / p>

[int(length),14]