【问题标题】:Shortest way to replace parts of strings in NumPy array替换 NumPy 数组中部分字符串的最短方法
【发布时间】:2017-09-13 20:38:16
【问题描述】:

我有一个 NumPy 字符串数组

['HD\,315', 'HD\,318' ...]

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

 ['HD 315', 'HD 318' ...]

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

【问题讨论】:

  • [s.replce('HD\,', 'HD ') for s in L]
  • 所以列表理解一定不是你的选择吗?
  • 'HD\,315' 'HD\,318' 是单字符串吗?或者应该有一个, 作为'HD\,315', 'HD\,318'
  • 谢谢!我添加了“,”
  • 感谢@GrijeshChauhan!这就是我需要的(错印'replce')

标签: python arrays numpy


【解决方案1】:

使用python列表推导:

L = ['HD\,315', 'HD\,318' ]
print [s.replace('HD\,' , 'HD ') for s in L]

但它使用for

您也可以使用 map():

print map(lambda s: s.replace('HD\,' , 'HD '), L)

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

【讨论】:

  • 如果我有一个要替换的值列表,例如["HD\", "HA\", "AB],使用您所说的列表理解进行迭代的最有效方法是什么?
【解决方案2】:

您可以使用 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')

【讨论】:

  • 现在你只需要np.char.replace
【解决方案3】:

如果你的字符串是固定长度的,并且你的数组是字符串类型,而不是对象类型,那么沿着这些路线的东西会起作用。请注意,它绕过了 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

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

np.char.replace(data, ',', ' ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2013-09-21
    • 2019-12-13
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多