如何强制Numpy将元素视为对象而非自动转为多维数组
强制NumPy创建元素为数组的对象数组(避免多维数组优化)
当所有子数组形状相同时,直接使用np.array([subarrays], dtype=object)会被NumPy自动优化为多维数组,而我们需要保留元素为独立数组的对象数组格式以适配数据库库。以下是几种可行的解决方法:
方法1:先初始化空对象数组再填充
这是最直接且可靠的方式,先创建指定长度的空对象数组,再将子数组逐个赋值进去:
import numpy as np # 准备要存储的子数组列表 sub_arrays = [np.array([1., 2., 3.]), np.array([4., 5., 6.])] # 初始化空的对象数组 obj_array = np.empty(len(sub_arrays), dtype=object) # 将子数组赋值到对象数组中 obj_array[:] = sub_arrays print(obj_array) # 输出:array([array([1., 2., 3.]), array([4., 5., 6.])], dtype=object)
方法2:插入临时元素打破形状一致性(临时 hack 方式)
通过插入一个非数组类型的临时元素,让NumPy无法优化为多维数组,之后再移除该元素:
import numpy as np # 插入None作为临时元素,避免被优化 temp_array = np.array([np.array([1.,2.,3.]), None, np.array([4.,5.,6.])], dtype=object) # 删除临时元素 obj_array = np.delete(temp_array, 1) print(obj_array) # 输出:array([array([1., 2., 3.]), array([4., 5., 6.])], dtype=object)
方法3:使用np.fromiter构造对象数组
利用np.fromiter直接从迭代器构造对象数组,指定dtype=object:
import numpy as np sub_arrays = [np.array([1., 2., 3.]), np.array([4., 5., 6.])] obj_array = np.fromiter(sub_arrays, dtype=object) print(obj_array) # 输出:array([array([1., 2., 3.]), array([4., 5., 6.])], dtype=object)
以上方法都能成功创建元素为独立数组的对象数组,满足数据库库的格式要求。
内容的提问来源于stack exchange,提问作者L1RG0
相关产品推荐
相关产品推荐

