Python矩阵字符串按行拼接:求类似np.sum的高效实现方法
实现类似
np.sum的字符串行拼接方法 当然有办法!针对大规模矩阵的高效字符串拼接,我们可以用两种思路:一种是简洁易读的方法,另一种是纯向量化的高效方法(更适配超大规模矩阵)。
先看你的输入示例:
import numpy as np arr = np.array([['', '', 'C'], ['A', '', 'C'], ['', 'B', '']], dtype='|S9')
方法一:简洁易读的行处理(适合中小规模,代码直观)
用np.apply_along_axis遍历每行,过滤空字符串后拼接,代码非常直观:
# 因为原数组是bytes类型(dtype='|S9'),需要先解码为字符串 result = np.apply_along_axis( lambda row: ' '.join([s.decode() for s in row if s != b'']), axis=1, arr=arr ).reshape(-1, 1)
如果你的数组是Unicode字符串类型(dtype='U'),去掉.decode()即可:
result = np.apply_along_axis( lambda row: ' '.join([s for s in row if s != '']), axis=1, arr=arr ).reshape(-1, 1)
执行后就能得到你要的输出:
array([['C'], ['A C'], ['B']], dtype='<U3')
方法二:纯向量化高效拼接(适配超大规模矩阵)
如果矩阵规模极大,apply_along_axis的循环会有性能瓶颈,这时候可以用numpy的字符操作模块np.char做纯向量化处理,避免显式循环:
from functools import reduce # 1. 按行累积拼接元素,中间加空格 temp = reduce(lambda a, b: np.char.add(np.char.add(a, b' '), b), arr.T) # 2. 去掉首尾多余的空格 temp = np.char.strip(temp) # 3. 替换中间连续的多个空格为单个空格(处理空字符串带来的多余空格) temp = np.char.replace(temp, b' ', b' ') # 4. 调整形状为列数组 result = temp.reshape(-1, 1)
同样,Unicode字符串版本把b' '换成' ',b' '换成' '即可。这种方法完全利用numpy的向量化运算,速度会比循环快很多,适合处理超大规模矩阵。
关键说明
- 两种方法都能实现类似
np.sum的按行聚合效果,区别在于性能和代码简洁性的权衡; - 注意区分numpy字符串数组的类型:
|S是bytes类型,U是Unicode字符串类型,处理时要对应调整解码或字符串常量。
内容的提问来源于stack exchange,提问作者S.Perera
相关产品推荐
相关产品推荐

