You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NumPy中将单轴扩展为双轴:实现字符串ndarray拆分为字符数组

实现方法

要实现numpy字符串数组拆分为字符数组,核心要保证维度匹配要求,你之前用np.apply_along_axis没得到预期结果,是因为这个函数默认会将子数组转为numpy数组,直接拆分字符串会被识别为标量处理,用以下方案更合适:

方法1:使用numpy视图转换(高效,要求所有字符串长度相同)

该方案无循环、性能极高,适合处理大规模数组,前提是输入数组内所有字符串长度完全一致,和MATLAB字符数组的要求对齐:

import numpy as np

# 示例输入数组
str_arr = np.array([["abc", "def"], ["ghi", "jkl"]], dtype=str)

# 拆分字符并调整维度匹配MATLAB输出格式
# 先将字符串数组拆分为单个字符,得到shape为(2,2,3)的数组
char_arr = str_arr.view('U1')
# 交换最后两个维度,得到shape为(2,3,2)的目标数组,和MATLAB输出一致
char_arr = char_arr.swapaxes(-1, -2)

# 验证输出
print(char_arr.shape) # 输出 (2, 3, 2)
print(char_arr[:,:,0]) # 对应MATLAB ans(:,:,1),输出 [['a' 'b' 'c'], ['g' 'h' 'i']]
print(char_arr[:,:,1]) # 对应MATLAB ans(:,:,2),输出 [['d' 'e' 'f'], ['j' 'k' 'l']]

方法2:通用兼容方法(支持非等长字符串,性能略低)

如果你的字符串长度不统一,可以用frompyfunc实现,正确写法如下:

import numpy as np

str_arr = np.array([["abc", "def"], ["ghi", "jkl"]], dtype=str)
# 定义将单个字符串拆分为字符列表的函数
split_fn = np.frompyfunc(list, 1, 1)
# 对每个元素执行拆分,得到嵌套列表结构的数组
char_list = split_fn(str_arr)
# 转换为标准numpy数组并调整维度
char_arr = np.array(char_list.tolist()).swapaxes(-1, -2)

反向操作优化(字符数组转回字符串数组)

你提供的反向操作可以用视图方法优化,避免循环,性能提升明显:

# 输入为shape (2,3,2)的字符数组
char_arr = np.array([[['a', 'd'], ['b', 'e'], ['c', 'f']], [['g', 'j'], ['h', 'k'], ['i', 'l']]])
# 先交换维度回(2,2,3)
temp = char_arr.swapaxes(-1, -2)
# 按字符串长度合并为对应长度的字符串类型,去掉最后一维
str_arr = temp.view(f'U{temp.shape[-1]}').squeeze(axis=-1)

内容的提问来源于stack exchange,提问作者orangeman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:15:00