如何确保拆分二维列表得到的NumPy数组均为float64类型且维度不变?
问题与解决方案
问题背景
我编写了一段Python脚本,用于将二维列表my_list的每一行拆分为两部分:array1包含每行除最后两个元素外的所有元素,array2包含每行的最后两个元素。由于my_list的行长度不固定(假设每行元素数量均大于2),出现了数据类型不一致的问题。
示例代码
import numpy as np my_list = [[1, 2, 3, 4], [5, 6, 7]] back_crop = 2 list1 = [np.array(row[:-back_crop], dtype=np.float64) for row in my_list] list2 = [np.array(row[-back_crop:], dtype=np.float64) for row in my_list] array1 = np.array(list1, dtype=object) array2 = np.array(list2, dtype=object) print(array1, '\n', array2) print(array1[0].dtype, array2[0].dtype)
运行输出
[array([1., 2.]) array([5.])] [[3.0 4.0] [6.0 7.0]] float64 object
需求:修改代码,确保array1和array2中的数组均为float64数据类型,同时保持当前的数组维度(不使用零或NA值填充)。
问题原因
当创建array2时,list2中的每个子数组长度固定为2,Numpy会自动将其合并为一个二维float64数组,而非保持object类型的数组容器。而array1因为子数组长度不一致(2和1),只能保留为object类型数组,每个元素是独立的float64数组,这就导致了两者数据类型表现不一致。
解决方法
要让array2也保持object类型(每个元素为独立的float64数组),需要强制Numpy将list2作为对象数组创建,而非自动合并。以下是两种可行方案:
方案一:手动创建空对象数组并赋值
先初始化一个指定长度的object类型数组,再逐个填充元素,避免Numpy自动合并:
import numpy as np my_list = [[1, 2, 3, 4], [5, 6, 7]] back_crop = 2 list1 = [np.array(row[:-back_crop], dtype=np.float64) for row in my_list] list2 = [np.array(row[-back_crop:], dtype=np.float64) for row in my_list] array1 = np.array(list1, dtype=object) # 创建空的object数组,再逐个赋值 array2 = np.empty(len(list2), dtype=object) for idx in range(len(list2)): array2[idx] = list2[idx] print(array1, '\n', array2) print(array1[0].dtype, array2[0].dtype)
方案二:显式构造对象数组
通过列表推导式包装子数组,强制Numpy识别为对象数组:
import numpy as np my_list = [[1, 2, 3, 4], [5, 6, 7]] back_crop = 2 list1 = [np.array(row[:-back_crop], dtype=np.float64) for row in my_list] list2 = [np.array(row[-back_crop:], dtype=np.float64) for row in my_list] array1 = np.array(list1, dtype=object) # 用列表推导式确保每个元素被当作独立对象 array2 = np.array([arr for arr in list2], dtype=object) print(array1, '\n', array2) print(array1[0].dtype, array2[0].dtype)
运行结果
两种方案的输出均为:
[array([1., 2.]) array([5.])] [array([3., 4.]) array([6., 7.])] float64 float64
此时array1和array2均为object类型的一维数组,每个元素都是float64类型的子数组,完全符合需求且未填充额外值。
内容的提问来源于stack exchange,提问作者Mert Onur
相关产品推荐
相关产品推荐

