在矩阵python中连接字符串

时间:2018-04-06 23:02:01

标签: python numpy string-concatenation

我有一个带字符串的矩阵,如下所示,

array([['', '', 'C'],
       ['A', '', 'C'],
       ['', 'B', '']], dtype='|S9')

我需要在每一行中连接列以获得类似于以下的输出,

array([['C'],
       ['A C'],
       ['B']])

我需要应用的矩阵大小非常大。是否有类似于python中的列总和与np.sum(matrix, axis=0)类似的字符串连接?

1 个答案:

答案 0 :(得分:1)

np.tensordot有一个利用运算符重载字符串(不是字符串dtypes)的示例。以此为线索我尝试了以下内容:

In [678]: arr = np.array([['', '', 'C'],
     ...:        ['A', '', 'C'],
     ...:        ['', 'B', '']], dtype='U3')
     ...:        

我在py3中,所以U显示更清晰。 U3 dtypes不实现`+'。但是将字符串dtype转换为object dtype会创建一个真正的Python字符串数组:

In [679]: arrO=arr.astype(object)

In [681]: arrO
Out[681]: 
array([['', '', 'C'],
       ['A', '', 'C'],
       ['', 'B', '']], dtype=object)

现在sum加入字符串,实际上正在执行'A'+''+'C'等等:

In [682]: np.sum(arrO, axis=1)
Out[682]: array(['C', 'AC', 'B'], dtype=object)

np.char有一些函数将字符串方法应用于字符串dtype数组的元素。有一个np.char.join但它在元素方面有效,而不是跨元素。

np.split适用于数组元素,但它会生成列表:

In [690]: np.char.split(np.array(['A B C','D E F']))
Out[690]: array([list(['A', 'B', 'C']), list(['D', 'E', 'F'])], dtype=object)

它可以与np.char.join

相反
In [691]: np.char.join(',',_)
Out[691]: array(['A,B,C', 'D,E,F'], dtype='<U5')
In [699]: np.char.join('',Out[690])
Out[699]: array(['ABC', 'DEF'], dtype='<U3')

如果join可以转换为arr,那么np.array(list(['','','C']),..., dtype=object)就可以了。

但是在走这条路太远之前,我应该注意np.char函数可以很方便,但是它们并不比使用相同字符串方法的列表推导快得多。