2016-12-05 117 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鏈接中有一些很好的例子。