假设我有这样一个数组:
>>> 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:此问题没有回答我的问题,因为它使用了理解或使用列表作为数组的行,这是我无法承受的。
join
是连接字符串列表最干净的方法。我只会迭代行。在处理字符串时,numpy方法并不更快。进行一些时间测试。无循环魔法仅适用于数字操作。 - hpauljpd.DataFrame(x).agg(' '.join,1).to_numpy()
:这会有帮助吗?尽管我们必须检查,因为如上评论所述,数据类型被转换为“object”。 - ankynumpy
完成,我有点不愿引入pandas
,除非pandas
可以带来重大改进。我需要进行一些测试。我相信这肯定比基于循环的方法要好。正如@hpaulj所说,我需要进一步测试所有的方法。 - Sayandip Duttax[:,i] + x[:,i+1] + x[:,i+2] + ...
也不会太糟糕,尽管我在问题中要求不要使用循环。但是,是的,我明白你的意思,我想我应该花更多时间来衡量不同的方法。谢谢大家。 - Sayandip Dutta