Python:Numba能在nopython模式下处理字符串数组吗?

13

我正在使用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
@Andrey:是的,我确定。x[0]='一些',x[1]='文本',等等。您可以在循环中禁用numba并添加“print txt[i]”来轻松查看此内容。 - Pythonista anonymous
2个回答

13

numba现在支持字符串(自0.41版本以来)


你知道什么时候会支持str.encode()吗? - Lo Bellin

12

Numba目前(截至20.0版本)还不支持字符串。实际上,"字符序列是受支持的,但是它们上面没有可用的操作"

事实上,一种可能的解决方法是将字符解释为数字。对于ASCII字符,这很简单,可以使用Python中的ordchr函数。然而,即使对于您的最小示例,您最终得到的函数也要不易读:

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函数中使用它。然而,这并不适用于所有情况。 - Pythonista anonymous
3
此回答已过时。当前,Numba已支持对字符串(str)的处理。 - valentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接