在Numpy中沿轴降维字符串的多维数组

4

Numpy实现了一些用于减少多维字符串数组的函数吗?我知道它提供了一些用于多个数组字符串连接的功能,但我还没有找到有关字符串缩减的任何信息。

假设我有一个二维字符串数组:

np.array([['a', 'b', 'c'],['e','f','g']])

我希望你能将其转换为:

np.array(['a b c','e f g'])

有没有比使用for循环更好的方法,例如:
old_strings = np.array([['a', 'b', 'c'],['e','f','g']])
new_strings = np.array([])
for s in old_strings:
    new_strings = np.append(new_strings, (' '.join(s)))

所有元素都是单个字符吗? - Divakar
空格是否重要,还是''.join(s)就足够了? - jpp
@Divakar 在这个例子中是这样的,但我正在处理的问题涉及到字符串。 - Rumák
@jpp 不是精确的空格,但是需要一些分隔符。 - Rumák
2个回答

3

使用常规字符串操作比使用np.char.join更好。

>>> arr = np.array([['a', 'b', 'c'],['e','f','g']])
>>> np.array([' '.join(i) for i in arr])
array(['a b c', 'e f g'], dtype='<U5')

会比 np.char.join 更快。
%timeit np.array([' '.join(i) for i in arr])
8.69 µs ± 30 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit np.char.join(' ', arr)
14.6 µs ± 86.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

在一个更大的数组上:

arr = np.repeat(arr, 10000).reshape(-1, 3)

%timeit np.array([' '.join(i) for i in arr])
54.2 ms ± 596 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit np.char.join(' ', arr)
72.3 ms ± 2.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

其实情况更糟,arr = np.array([['a', 'b', 'c'],['e','f','g']]); np.char.join(' ', arr) 甚至都_不能_正常工作...你必须强制NumPy将其视为列表数组才能获得相同的结果。 - jdehesa
如果您已经有一个字符串列表的数组,这已经涉及到一些开销,如果需要从原始字符串数组创建它,则两种方法的性能似乎相同... - jdehesa

2

这是一种你可以强制NumPy API执行的方法,尽管它可能与自己执行没有太大区别:

import numpy as np

# Make one-dimensional array of lists of strings
a = np.array([None, None])
a[0] = ['a', 'b', 'c']
a[1] = ['e', 'f', 'g']
# Join
print(np.char.join(' ', a))
>>> ['a b c' 'e f g']

谢谢回答!虽然它回答了我的问题,但我选择@user3483203的答案,因为它还提供了不同、可能更优化的解决方案的见解。 - Rumák

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