是否有一个Numpy等效于字符串`translate`?

时间:2018-12-18 18:55:27

标签: python numpy

如果我有一个字符串

>>> s = "abcdef"

我可以用多个字符代替

>>> s.translate(str.maketrans("abc", "xyz"))
xyzdef

是否有一个函数可以在Numpy中复制此行为?即一些func这样

>>> np.func(arr, mapping)
mapped_array

此功能可以实现为

def func(arr, mapping):
    new_arr = arr.copy()
    for k, v in mapping.items():
        new_arr[new_arr == k] = v
    return new_arr

但是对于大型数组和/或大型映射,这将非常慢。

2 个答案:

答案 0 :(得分:2)

translate是字符串操作。 np.char有很多函数,可将此类方法应用于字符串dtype数组的所有元素:

In [7]: s = "abcdef"
In [8]: arr = np.array([[s,s,s],[s,s,s]])
In [9]: arr
Out[9]: 
array([['abcdef', 'abcdef', 'abcdef'],
       ['abcdef', 'abcdef', 'abcdef']], dtype='<U6')
In [10]: np.char.translate(arr, str.maketrans("abc", "xyz"))
Out[10]: 
array([['xyzdef', 'xyzdef', 'xyzdef'],
       ['xyzdef', 'xyzdef', 'xyzdef']], dtype='<U6')

但是,因为它调用字符串方法,所以它并不是特别快。过去的测试表明,这些功能与显式循环的速度大致相同。

如果此类替换的数量有限,则可以在建议的副本中使用一种映射方法。但是,如果您想发挥str.translate的全部功能,那么这或某些迭代是您可以做的最好的事情。 numpy未在编译后的代码中实现字符串操作。

frompyfunc是将函数应用于数组所有元素的好方法。它往往比更明确的循环要适度更快:

In [11]: np.frompyfunc(lambda s: s.translate(str.maketrans("abc", "xyz")),1,1)(arr)
Out[11]: 
array([['xyzdef', 'xyzdef', 'xyzdef'],
       ['xyzdef', 'xyzdef', 'xyzdef']], dtype=object)
In [12]: _.astype('U6')
Out[12]: 
array([['xyzdef', 'xyzdef', 'xyzdef'],
       ['xyzdef', 'xyzdef', 'xyzdef']], dtype='<U6')

答案 1 :(得分:1)

numpy中没有字典,因此没有直接等效的机制。

如果“键”在短范围内(例如Unicode字符),则可以使用索引技术快速替换来构建查找表来替换某些键:

foo