2016-12-05 77 views
0

假设我们有一个numpy.ndarraynumpy.str_元素。例如,下面arrnumpy.ndarray像这样2个numpy.str_元素:字符串在numpy数组中切片

arr = ['12345"""ABCDEFG' '1A2B3C"""'] 

试图每个numpy的元件上执行字符切片。

例如,我们如何可以切片的第一个元素'12345"""ABCDEFG'使我们以字符串REPL替换它的最后10个字符,即

arr = ['12345REPL' '1A2B3C"""'] 

同样,是能够进行字符串替换,例如替换特定符号后的所有字符?

+0

这可能会引起一些人的兴趣 - ['我如何切割一个numpy字符串数组的每个元素?](http://stackoverflow.com/questions/39042214)。 – Divakar

+0

请注意,语法'arr = ['12345“”“''']'实际上意味着'arr = ['12345”“”ABCDEFG1A2B3C“”''''' – Eric

回答

1

字符串是不可变的,所以您应该创建切片并手动重组或使用正则表达式。例如,要更换你的阵列,arr的第一个元素的最后10个字符,你可以这样做:

import numpy as np 
import re 

arr = np.array(['12345"""ABCDEFG', '1A2B3C"""']) 
arr[0] = re.sub(arr[0][-10:], 'REPL', arr[0]) 

print(arr) 
#['12345REPL' '1A2B3C"""'] 

如果你想更换一个特定字符后,你可以使用正则表达式或发现所有字符字符串中该字符的索引并将其用作切片索引。

编辑:您的评论更多的是正则表达式不是简单的Python切片,但是这是你如何可以在三重引号替换后一切:

re.sub('["]{3}(.+)', 'REPL', arr[0]) 

此行实际上是说,“查找三重报价和一切之后,但只能替换三重引号后的每个字符。“

+0

很好。你能否展示如何替换''“”'(包括''“”'')后面的所有字符?我知道正则表达式是'[''] {3}',但我很困惑如何把它放在这个'sub'中,或者只是显示如何找到这些3个引号的索引你的编辑 –

+0

我编辑了答案。 –

1

在python中,字符串是不可变的。另外,在NumPy中,数组标量是不可变的;你的字符串因此是不可变的。

你想要做的切片是把你的字符串当作一个列表来访问元素。

说我们有,我们希望在第三个字母切片,不包括第三个字母的字符串:

my_str = 'purple' 
sliced_str = my_str[:3] 

现在,我们有字符串的一部分,说我们想代替ž对每一封信跟随我们切片的地方。我们将不得不与拉出我们想要的字母新的字符串的工作,并创建所需的字符串的附加字符串,我们要创建:

# say I want to replace the end of 'my_str', from where we sliced, with a string named 's' 
s = 'dandylion' 
new_string = sliced_str + s  # returns 'pudandylion' 

因为字符串类型是不可变的,你必须存储元素你想保留,然后将存储的元素与你想添加到新变量中的元素结合起来。

+0

感谢您的解释。但是,如果您可以给出一个小代码示例来说明我的切片如何在numpy数组元素中特别发生,那么这对我来说很好理解。 –

0

np.char具有replace函数,它适用于相应的字符串方法与阵列的每个元素:

In [598]: arr = np.array(['12345"""ABCDEFG', '1A2B3C"""']) 
In [599]: np.char.replace(arr,'"""ABCDEFG',"REPL") 
Out[599]: 
array(['12345REPL', '1A2B3C"""'], 
     dtype='<U9') 

在它可以被制成工作这个特殊的例子,但它是几乎没有通用的re.sub。这些函数只比在数组上迭代更快。在@Divakar's链接中有一些很好的例子。