Python:numba 可以在 nopython 模式下处理字符串数组吗?
Posted
技术标签:
【中文标题】Python:numba 可以在 nopython 模式下处理字符串数组吗?【英文标题】:Python: can numba work with arrays of strings in nopython mode? 【发布时间】:2015-11-10 10:35:27 【问题描述】:我正在使用 pandas 0.16.2、numpy 1.9.2 和 numba 0.20。
有没有办法让 numba 在 nopython 模式下支持字符串数组? 或者,我可以以某种方式将字符串转换为 numba 可以识别的数字吗?
我必须在字符串数组(pandas 数据帧中的一列)上运行某些循环;如果我可以使用 numba,代码会快很多。
我想出了这个最小的例子来说明我的意思:
import numpy as np
import numba
x=np.array(['some','text','this','is'])
@numba.jit(nopython=True)
def numba_str(txt):
x=0
for i in xrange(txt.size):
if txt[i]=='text':
x += 1
return x
print numba_str(x)
我得到的错误是:
Failed at nopython (nopython frontend)
Undeclared ==([char x 4], str)
谢谢!
【问题讨论】:
纯粹从错误来看,您似乎以某种方式将整个数组/列表与字符串进行了比较。你确定txt[i]
不是整个列表吗?
@Andrey:是的,我确定。 x[0]='some'、x[1]='text' 等。您可以很容易地看到这个禁用 numba 并在循环中添加 'print txt[i]'。
【参考方案1】:
Numba 尚不支持字符串(从 20.0 版开始)。其实"character sequences are supported, but no operations are available on them"。
确实,一种可能的解决方法是将字符解释为数字。对于 ASCII 字符,这很简单,请参阅 Python ord
和 chr
函数。但是,对于您的最小示例,您以可读性较差的函数结束:
import numpy as np
import numba
x=np.array(['some','text','this','is'])
@numba.jit(nopython=True)
def numba_str(txt):
x=0
for i in xrange(txt.shape[0]):
if (txt[i,0]==116 and # 't'
txt[i,1]==101 and # 'e'
txt[i,2]==120 and # 'x'
txt[i,3]==116): # 't'
x += 1
return x
print numba_str(x.view(np.uint8).reshape(-1, x.itemsize))
【讨论】:
我在一个案例中设法避免了这个问题,因为文本字段是数据库表的主键,所以我在 Numba 之外创建了另一个数字主键,并在我的 Numba 函数中使用了它.然而,这并不适用于所有情况。 这个答案已经过时了。 numba 现在支持str
【参考方案2】:
numba 现在支持str
(从 0.41 版开始)
【讨论】:
你知道什么时候会支持 str.encode() 吗?以上是关于Python:numba 可以在 nopython 模式下处理字符串数组吗?的主要内容,如果未能解决你的问题,请参考以下文章