将字符串/字符数组加入带有分隔符的单个字符串 [不使用理解、映射等]

Posted

技术标签:

【中文标题】将字符串/字符数组加入带有分隔符的单个字符串 [不使用理解、映射等]【英文标题】:Join array of strings/chars into single string with separator [without using comprehension, map, etc.] 【发布时间】:2020-04-20 09:44:14 【问题描述】:

假设我有一个这样的数组:

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

我想加入每一行中的每个元素,所以像这样:

[['HappyNewYear'],
['***']]

我可以这样做:

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

但是如何使用分隔符实现串联呢?

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

但似乎找不到没有loops (comprehensions), map, or apply_along_axis 的方法。 numpy 中是否有 in-built 函数可以做到这一点?

np.char.array 中找到了一个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', '***'], dtype='<U15')

我在这里没有找到任何可以准确回答我的问题的问题。有人可以帮帮我吗?

编辑:我真的很想在这里加快速度,如果这在pandas 中可以实现,那也可以。

编辑 2: This question 没有回答我的问题,因为它使用理解或使用列表作为数组的行,这是我买不起的。

【问题讨论】:

Python join 是加入字符串列表的最简洁方式。我只会遍历行。在处理字符串时,numpy 方法并没有更快。做一些时间测试。无循环魔法仅适用于数值运算。 熊猫会帮忙吗?如果有帮助,我会添加熊猫标签。 pandas 使用 object dtype 作为字符串 - 所以它的字符串是 python 字符串,而不是 numpy 'U' dtypes。 熊猫方式:pd.DataFrame(x).agg(' '.join,1).to_numpy():这有帮助吗?虽然我们必须检查,因为 dtypes 已转换为object,如上述评论中所述 @anky_91 是的,这就是我正在尝试的。此外,我认为我有 ~100 列和 ~10**5 行,我想迭代列并这样做x[:,i] + x[:,i+1] + x[:,i+2] + ... 也不会那么糟糕,即使我在问题中要求没有循环。但是,是的,我明白你的意思,我想我应该花更多的时间来衡量不同的方法。谢谢大家。 【参考方案1】:

您总是可以添加一个空格然后删除:

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

【讨论】:

酷!我想它比显式迭代技术更快。必须做一些测试。【参考方案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 += ' ' 的任何原因? @SayandipDutta 使用x += ' ',您还将' ' 添加到最后一列。

以上是关于将字符串/字符数组加入带有分隔符的单个字符串 [不使用理解、映射等]的主要内容,如果未能解决你的问题,请参考以下文章

将带有空格分隔符的字符串转换为数组。并输出这个数组,就像一个字符串

如何使用 Angular js 或 java 脚本将逗号分隔的字符串分解为单个索引数组

sql数组转换为字符串

字符串到单个数字

将带有坐标的单个字符串转换为 CLLocationCoordinate2D 数组,并使用该数组在 mapView 中生成多边形

如何将表格视图数组中的每个字符串分隔到自己的单元格中?