我有一个带字符串的矩阵,如下所示,
array([['', '', 'C'],
['A', '', 'C'],
['', 'B', '']], dtype='|S9')
我需要在每一行中连接列以获得类似于以下的输出,
array([['C'],
['A C'],
['B']])
我需要应用的矩阵大小非常大。是否有类似于python中的列总和与np.sum(matrix, axis=0)
类似的字符串连接?
答案 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
函数可以很方便,但是它们并不比使用相同字符串方法的列表推导快得多。