python - Numba - 字符串类型
问题描述
我认为这是一个简单的问题,但我发现 numba 文档缺乏关于如何将字符串类型与 numpy 数组和字典一起使用的内容。我有一个我想使用 numba 的函数,它需要一个邮政编码列表,然后是一个映射邮政编码 -> 值的字典。我知道我可以将 zip 转换为 int 数据类型,但我希望能够使用其他无法强制转换为 int 类型的值来执行此操作。
from numba.typed import Dict
from numba.core import types
@jit(nopython=True)
def zip_func(zip_array,zip_dict):
return zip_dict[zip_array[0]]
#This would be a longer array using real data
myzips = np.array(['12345'],dtype='<U5')
mydict = {"12345":5}
numba_dict = Dict.empty(key_type=types.unicode_type,value_type=types.int64)
for key,value in mydict.items():
numba_dict[key] = value
zip_func(myzips,numba_dict)
这会产生以下错误,如果我理解正确,当键键入为 types.unicode_type 时,它基本上不能使用长度为 5 的固定长度字符串作为键。如何对齐这些类型?
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-4-93b4a32d59d4> in <module>
12 for key,value in mydict.items():
13 numba_dict[key] = value
---> 14 zip_func(myzips,numba_dict)
/sas/python/app/miniconda3/envs/py3lu/lib/python3.6/site-packages/numba/core/dispatcher.py in _compile_for_args(self, *args, **kws)
399 e.patch_message(msg)
400
--> 401 error_rewrite(e, 'typing')
402 except errors.UnsupportedError as e:
403 # Something unsupported is present in the user code, add help info
/sas/python/app/miniconda3/envs/py3lu/lib/python3.6/site-packages/numba/core/dispatcher.py in error_rewrite(e, issue_type)
342 raise e
343 else:
--> 344 reraise(type(e), e, None)
345
346 argtypes = []
/sas/python/app/miniconda3/envs/py3lu/lib/python3.6/site-packages/numba/core/utils.py in reraise(tp, value, tb)
78 value = tp()
79 if value.__traceback__ is not tb:
---> 80 raise value.with_traceback(tb)
81 raise value
82
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Internal error at <numba.core.typeinfer.IntrinsicCallConstraint object at 0x7ff4562e2518>.
Failed in nopython mode pipeline (step: nopython mode backend)
Cannot cast [unichr x 5] to unicode_type: %".21" = load [5 x i32], [5 x i32]* %"key"
File "../../../python/app/miniconda3/envs/py3lu/lib/python3.6/site-packages/numba/typed/dictobject.py", line 730:
def impl(d, key):
castedkey = _cast(key, keyty)
^
[1] During: lowering "$0.4 = call $0.1(key, $0.3, func=$0.1, args=[Var(key, dictobject.py:730), Var($0.3, dictobject.py:730)], kws=(), vararg=None)" at /sas/python/app/miniconda3/envs/py3lu/lib/python3.6/site-packages/numba/typed/dictobject.py (730)
[2] During: typing of intrinsic-call at <ipython-input-4-93b4a32d59d4> (7)
Enable logging at debug level for details.
File "<ipython-input-4-93b4a32d59d4>", line 7:
def zip_func(zip_array,zip_dict):
return zip_dict[zip_array[0]]
解决方案
您可以从 unichar dtype 创建自定义 Numba 类型,而不是numba.types.unicode_type
用作字典。key_type
np_unichar = numpy.dtype('<U5')
UnicharType = numba.from_dtype(np_unichar)
现在,您可以UnicharType
用来告诉 Numba 您需要 type 的值[unichr x 5]
。
或者,我发现简单地将空字符串添加到 a[unichr x N]
将强制进行类型转换。这意味着,zip_array[0] + ''
将被处理为numba.types.unicode_type
.
推荐阅读
- python - 在django中将注册表单填写到数据库后如何存储用户选择的单选按钮值?
- javascript - 我如何编写承诺链
- css - Bootstrap 4 下拉按钮不会在固定高度表中弹出
- arrays - 当我尝试过滤的数组元素不存在时出现问题
- docker - 有没有办法在应用引擎中安装一次软件包以避免每次长时间部署?
- kubernetes - 在 Minikube 上部署 GitLab
- javascript - w2ui忽略html表单中的值
- python - 在 python 中与 ganache-cli 同步
- java - 如何将子集合添加到在 Firestore 中添加数据的文档?
- uber-api - Uber API 限制为 5 个应用程序?