You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保拆分二维列表得到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:53:16