如何在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
相关产品推荐
相关产品推荐

