在NumPy数组中替换部分字符串的最短方法

dra*_*ega 5 python arrays numpy

我有一个NumPy字符串数组

['HD\,315', 'HD\,318' ...]
Run Code Online (Sandbox Code Playgroud)

我需要将每个'HD \''替换为'HD',即我想获得如下所示的新数组

 ['HD 315', 'HD 318' ...]
Run Code Online (Sandbox Code Playgroud)

在Python中解决此任务的最简单方法是什么?没有FOR循环可以做到这一点吗?

Gri*_*han 8

使用python list comprehension:

L = ['HD\,315', 'HD\,318' ]
print [s.replace('HD\,' , 'HD ') for s in L]
Run Code Online (Sandbox Code Playgroud)

但它使用 for

或者你可以使用map():

print map(lambda s: s.replace('HD\,' , 'HD '), L)
Run Code Online (Sandbox Code Playgroud)

用于python3 list(map(lambda s: s.replace('HD\,' , 'HD '), L))


use*_*362 7

您可以使用numpy.core.defchararray.replace函数,该函数使用numpy执行for操作:

import numpy.core.defchararray as np_f

data = ['HD\,315', 'HD\,318']

new_data = np_f.replace(data, 'HD\,', 'HD')
Run Code Online (Sandbox Code Playgroud)

  • 现在您只需要`np.char.replace`. (4认同)

Eel*_*orn 5

如果您的字符串是固定长度的,并且您的数组是字符串类型而不是对象类型,那么这些方面的内容将起作用。请注意,它绕过了 python for 循环,例如在列表理解中遇到的循环,并且相应地更快:

import numpy as np
data = np.array(['HD\,315', 'HD\,318'])

view = data.view(np.uint8).reshape(data.shape + (data.dtype.itemsize,))
view[:,2] = 32
print data
Run Code Online (Sandbox Code Playgroud)

当然,如果您的逗号可能出现在不同的地方,则需要进行逻辑索引(即 view[view==92] = 32)。即使你的字符串不是完全相等的长度,但至少是一个短且有界的长度,如果你有很多这样的字符串,将它们放在一个固定长度的数组中可以以一些额外的内存为代价加快速度. 请注意, numpy.char 包含许多用于矢量化字符串操作的有用实用程序函数。说到这...

np.char.replace(data, ',', ' ')
Run Code Online (Sandbox Code Playgroud)