2015-09-18 35 views
7

我有一個二維numpy字符串數組。有沒有辦法連接每一行中的字符串,然後將結果字符串與分隔符字符串進行連接,例如一個換行符?沿軸線連接numpy字符串數組?

例子:

pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

我想:

"Hello\nWorld\n" 
+0

是最後的'\ n''重要? 'join'的通常用法是在字符串之間放置分隔符,但不是最後。 – hpaulj

+0

這並不重要 - 我可以隨時添加它。 – ErikR

回答

7

這並不難做到外numpy的的

>>> import numpy as np 
>>> pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 
>>> pic 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 
>>> '\n'.join([''.join(row) for row in pic]) 
'Hello\nWorld' 

也有np.core.defchararray模塊,用字符數組處理「好東西」 - 但是,它聲明這些僅僅是python內置函數和標準庫函數的封裝,所以你可能不會通過使用它們來獲得任何真正的加速。

2

一種方法是使用str.join()和列表理解,例如 -

In [1]: import numpy as np 

In [2]: pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

In [3]: pic 
Out[3]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='<U1') 

In [4]: '\n'.join([''.join(x) for x in pic]) 
Out[4]: 'Hello\nWorld' 

如果你真的需要\n末,你可以加入個字符串後串連它。示例 -

In [5]: '\n'.join([''.join(x) for x in pic]) + '\n' 
Out[5]: 'Hello\nWorld\n' 
7

您在那裏有正確的想法。這裏有一個vectorized NumPythonic執行試圖沿着這些思路去 -

# Create a separator string of the same rows as input array 
separator_str = np.repeat(['\n'], pic.shape[0])[:,None] 

# Concatenate these two and convert to string for final output 
out = np.concatenate((pic,separator_str),axis=1).tostring() 

或者一個班輪與np.column_stack -

np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 

採樣運行 -

In [123]: pic 
Out[123]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 

In [124]: np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 
Out[124]: 'Hello\nWorld\n' 
+0

這非常有趣。 – ErikR

+0

@ user5402是的!我並不期望擁有純粹的nypythonic解決方案,但它最終解決了! :) – Divakar

+0

這很有趣。我有點懶得試一試,但我不知道如何比較其他(非numpy)解決方案。 – mgilson