如何将numpy数组每行转为独立ndarray实现嵌套结构
问题原因
你使用的numpy.apply_along_axis没有生效的核心原因是:该方法会自动将沿轴执行函数返回的等长结果,拼接为规则的数值类型ndarray。由于你传入的每一行长度一致,函数返回的数组会被直接合并为和原数组结构完全相同的普通二维数组,自然无法得到你需要的嵌套object结构。
实现方案
不需要写显式的Python层for循环,直接用numpy原生操作即可高效实现目标结构:
- 效率最高的写法:先构造对应形状的object类型空数组,再将原数组按行拆分后赋值
import numpy as np # 原数组 old_array = np.array([[0.00000, 0.00000, 50.00000], [0.00000, 10.02227, 50.00000], [0.00000, 20.04454, 50.00000], [0.00000, 30.06682, 50.00000], [0.00000, 40.08909, 50.00000]]) # 构造形状为(行数,1)的object类型数组 new_array = np.empty((old_array.shape[0], 1), dtype=object) # 将原数组按行拆分后赋值到对应位置 new_array[:, 0] = list(old_array)
执行后得到的new_array完全匹配你需要的结构:
array([[array([ 0., 0., 50.])], [array([ 0. , 10.02227, 50. ])], [array([ 0. , 20.04454, 50. ])], [array([ 0. , 30.06682, 50. ])], [array([ 0. , 40.08909, 50. ])]], dtype=object)
- 简洁一行写法:直接将按行拆分的数组转为object数组后调整维度
new_array = np.array(list(old_array), dtype=object)[:, np.newaxis]
注意事项
这种存储ndarray的object类型嵌套数组,会丢失numpy原生的向量化计算加速能力,如果不是业务场景强制要求该嵌套结构,使用普通二维数值数组的计算、存储效率都会高很多。
内容的提问来源于stack exchange,提问作者fma
相关产品推荐
相关产品推荐

