Numba键入可选np.ndarray的错误列表



下午好,

我在尝试jit这个函数时遇到了一个问题:

from typing import Optional
import numpy as np
from numba import njit
from numba.typed import List
@njit
def check_something(list_arrays: List[Optional[np.ndarray]], mask_array: np.ndarray):
for array in list_arrays:
if (
array is not None and
(np.bitwise_and(array, mask_array)).any()
):
# do something
if __name__=='__main__':
check_something([None, np.random.randint(0, 10, 11)], np.random.randint(0, 10, 11))

错误如下:

Traceback (most recent call last):
File "C:Usersllgittest-numba-error.py", line 17, in <module>
check_something([None, np.random.randint(0, 100, 1837)])
TypeError: not enough arguments: expected 2, got 1
PS C:Usersllgit> python .test-numba-error.py
Traceback (most recent call last):
File "C:Usersllgittest-numba-error.py", line 17, in <module>
check_something([None, np.random.randint(0, 100, 1837)], np.random.randint(0, 100, 1837))
File "C:Python39libsite-packagesnumbacoredispatcher.py", line 468, in _compile_for_args
error_rewrite(e, 'typing')
File "C:Python39libsite-packagesnumbacoredispatcher.py", line 409, in error_rewrite
raise e.with_traceback(None)
numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
No implementation of function Function(<ufunc 'bitwise_and'>) found for signature:
>>> bitwise_and(none, array(int32, 1d, C))
There are 2 candidate implementations:
- Of which 2 did not match due to:
Overload in function 'Numpy_rules_ufunc.generic': File: numbacoretypingnpydecl.py: Line 98.
With argument(s): '(none, array(int32, 1d, C))':
Rejected as the implementation raised a specific error:
TypingError: can't resolve ufunc bitwise_and for types [none, array(int32, 1d, C)]
raised from C:Python39libsite-packagesnumbacoretypingnpydecl.py:107
During: resolving callee type: Function(<ufunc 'bitwise_and'>)
During: typing of call at C:Userslltest-numba-error.py (11)

File "test-numba-error.py", line 11:
def check_something(list_arrays: List[Optional[np.ndarray]], mask_array: np.ndarray):
<source elided>
for array in list_arrays:
if array is not None and (np.bitwise_and(array, mask_array)).any():
^

当变量来自列表时,numba似乎没有得到array is not None检查。有什么方法可以让它理解我已经检查了值不是None吗?谢谢你抽出时间!

(Numba 0.56.0,Python 3.9.5(

Numba仅支持同构类型列表。具有None的列表是异构的,因此不支持它。不支持将可选作为类型列表的有效类型。AFAIK,它仅用于可选参数。事实上,nb.typed.typedlist.ListType(nb.types.Optional(nb.int32))清楚地报道了这一点。请注意,类型化列表与名为反射列表的纯Python列表不直接兼容,因此您无法像这样将基本CPython列表传递给Numba。Numba报告的错误令人困惑,因为Numba执行检查的顺序不同。简而言之,您尝试做的事情不受支持。此外,请注意,数组的维度及其邻接性是Numba类型的一部分,因此不能将它们混合在列表中。

最新更新