如果我有一个字符串
>>> 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
但是对于大型数组和/或大型映射,这将非常慢。
答案 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