如何阻止numpy.array将同形状数组列表转换为多维数组?
解决方法:强制返回对象数组而非多维数组
当然有办法实现这个需求!Numpy默认会在子数组形状一致时自动堆叠成多维数组,但我们可以通过以下几种方式强制它返回对象数组(每个元素都是独立的一维数组):
方法1:先创建空对象数组再逐个赋值
这是最直接可靠的方式,先初始化一个指定长度的对象数组,再把每个子数组赋值进去,完全避免自动堆叠:
import numpy as np # 初始化长度为2的对象数组 obj_arr = np.empty(2, dtype=object) # 分别赋值形状相同的子数组 obj_arr[0] = np.zeros(8) obj_arr[1] = np.zeros(8) print(obj_arr) # 输出: # array([array([0., 0., 0., 0., 0., 0., 0., 0.]), # array([0., 0., 0., 0., 0., 0., 0., 0.])], dtype=object)
方法2:用嵌套列表包装后重塑形状
如果不想手动赋值,可以先把每个子数组放在单元素列表里,让Numpy无法直接堆叠,再通过reshape还原成一维对象数组:
import numpy as np obj_arr = np.array([[np.zeros(8)], [np.zeros(8)]], dtype=object).reshape(-1) print(obj_arr) # 输出效果和方法1完全一致
为什么原来的写法会合并?
当你直接传入形状一致的子数组列表时,即使指定了dtype=object,Numpy仍然会优先尝试将它们堆叠成多维数组——这是它的默认行为,因为形状一致的数组更适合用多维结构存储。只有当子数组形状不一致时,它才会退而求其次创建对象数组。
内容的提问来源于stack exchange,提问作者SuperShoot
相关产品推荐
相关产品推荐

