将字符串/字符数组连接成一个带有分隔符的单一字符串 [不使用推导、映射等方法]

3

假设我有这样一个数组:

>>> x = np.array([['Happy','New','Year'],['Stack','Over','flow']])
>>> x
array([['Happy', 'New', 'Year'],
       ['Stack', 'Over', 'flow']], dtype='<U5')

我想将每行中的每个元素连接起来,就像这样:

[['HappyNewYear'],
['StackOverflow']]

我可以用以下方法实现:

>>> np.sum(x.astype(object), axis = 1)
array(['HappyNewYear', 'StackOverflow'], dtype=object)

但我该如何使用分隔符实现连接?

[['Happy New Year'],
['Stack Over flow']]

但是似乎找不到一种方法,不使用循环(理解),映射或apply_along_axis。在numpy中是否有一个内置函数可以实现这一点?
在np.char.array中发现了一个join方法join,但它似乎并没有按照我预期的工作。
>>> x = np.char.array(x)
>>> x.join('')
array([['', '', ''],
       ['', '', '']], dtype='<U1')
>>> x.join(x)
array([['HHappyaHappypHappypHappyy', 'NNeweNeww', 'YYeareYearaYearr'],
       ['SStacktStackaStackcStackk', 'OOvervOvereOverr', 'fflowlflowofloww']], dtype='<U25')

或者,
>>> np.char.join(' ',x)
array([['H a p p y', 'N e w', 'Y e a r'],
       ['S t a c k', 'O v e r', 'f l o w']], dtype='<U9')

"

np.sum(x, axis=1)无法正常工作,这让我感到惊讶,因为这个可以工作:

"
>>> x[:,0] + x[:,1] + x[:,2]
chararray(['HappyNewYear', 'StackOverflow'], dtype='<U15')

我在这里没有找到确切回答我的问题的任何问题。有人能帮我吗? 编辑:我真的很快,如果可以在pandas中实现,那也可以。 编辑2:此问题没有回答我的问题,因为它使用了理解或使用列表作为数组的行,这是我无法承受的。

2
Python中的join是连接字符串列表最干净的方法。我只会迭代行。在处理字符串时,numpy方法并不更快。进行一些时间测试。无循环魔法仅适用于数字操作。 - hpaulj
1
pandas使用对象dtype来处理字符串 - 因此它的字符串是Python字符串,而不是numpy的'U' dtype。 - hpaulj
1
pandas方式:pd.DataFrame(x).agg(' '.join,1).to_numpy():这会有帮助吗?尽管我们必须检查,因为如上评论所述,数据类型被转换为“object”。 - anky
我希望它能够。如果可以使用numpy完成,我有点不愿引入pandas,除非pandas可以带来重大改进。我需要进行一些测试。我相信这肯定比基于循环的方法要好。正如@hpaulj所说,我需要进一步测试所有的方法。 - Sayandip Dutta
1
@anky_91 是的,这就是我正在尝试的。而且我想,由于我有大约100列和10**5行,我猜在迭代列并执行 x[:,i] + x[:,i+1] + x[:,i+2] + ... 也不会太糟糕,尽管我在问题中要求不要使用循环。但是,是的,我明白你的意思,我想我应该花更多时间来衡量不同的方法。谢谢大家。 - Sayandip Dutta
显示剩余5条评论
2个回答

3

你可以随时添加空格然后去除:

>>> np.char.array(np.sum(x.astype(object) + ' ', axis = 1)).strip().astype(str)
chararray(['Happy New Year', 'Stack Over flow'], 
      dtype='<U16')
>>> 

太酷了!我猜它比显式迭代技术更快。得进行一些测试。 - Sayandip Dutta

2

您可以使用:

x = x.astype(object)
x[:,:-1] += ' '
x.sum(axis=1).reshape(-1, 1)

输出:

array([['Happy New Year'],
       ['Stack Over flow']], dtype=object)

是的,在你回答之前我就想到了这个问题,不知道为什么在我写问题时没有想起来。你使用 x[:,:-1] += ' ' 而不是 x += ' ' 有什么原因吗? - Sayandip Dutta
1
@SayandipDutta 通过 x += ' ',您也将 ' ' 添加到了最后一列。 - Mykola Zotko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接