【问题标题】:Concatenate strings in a matrix python在矩阵python中连接字符串
【发布时间】:2018-04-06 23:02:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您希望得到的dtype|S9 还是|S27? (而且,如果是前者,如果字符串太长而无法放入S9,您希望发生什么?)
  • 同时,您可以使用np.char functions add, join, etc.,但它们的实现是基于普通的Python函数。所以,你真的不能做太多的事情来提高这里的性能。它们不是ufuncs,因此适用于通过数组广播常规函数的通常规则,以及通常的性能警告。

标签: python numpy string-concatenation


【解决方案1】:

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

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

我在 py3 中,所以U 显示更清晰。 U3 dtypes 不实现 `+'。但是将 string 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')

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

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

【讨论】:

    最近更新 更多