Python3中嵌套列表重塑为(3,4)float64数组问题求助
Hey,我明白你现在的困扰——明明是3个长度为4的子列表,转成numpy数组却变成了(10,)的object类型,没法喂给全连接网络对吧?咱们一步步来解决:
首先,先揪出问题根源:正常情况下你给出的positions_train结构,用np.asarray()直接转应该就是(3,4)的float数组。你得到(10,)的object数组,说明你的实际数据结构肯定和你描述的不一样——要么是某个子列表被不小心拆成了单个元素,要么是括号位置写错了,导致整个列表变成了混合单个数值和小列表的结构,numpy只能把它当成object类型的一维数组。
不过不管怎样,咱们先给出肯定能解决的步骤:
第一步:先确认你的数据结构是对的
先跑一段代码检查每个子列表的长度:
import numpy as np positions_train = [ [0.300, 0.4500, 0.5900, 0.7812], [0.1200, 0.3400, 0.6700, 0.8400], [0.210, 0.2900, 0.500, 0.6700] ] # 检查每个子列表的长度,确保都是4 for i, sublist in enumerate(positions_train): print(f"第{i+1}个小列表长度:{len(sublist)}")
如果输出都是4,那结构没问题;要是有长度不是4的,那你就得先修正数据结构,把每个子列表都调整成4个元素的正确分组。
第二步:强制转换为float64类型的(3,4)数组
就算结构没问题,有时候numpy会“瞎猜”类型,咱们直接指定dtype=np.float64来强制转换:
positions_array = np.asarray(positions_train, dtype=np.float64) # 检查结果 print(f"数组形状:{positions_array.shape}") print(f"数组类型:{positions_array.dtype}")
正常这里会输出:
数组形状:(3, 4) 数组类型:float64
完美符合你的需求!
如果还是得到(10,)的数组?那得先修复数据
要是你跑上面的代码还是得到(10,)的object数组,那你的positions_train绝对不是你说的嵌套结构。比如可能是不小心把某个子列表的括号丢了,变成了混合单个元素和子列表的错误结构。这种情况下,你得先把数据重新整理成3个长度为4的子列表。
要是数据是扁平化的(比如本来应该是12个元素,你数成10个可能是笔误),那可以用reshape来救:
# 假设是扁平化的12个元素 flat_list = [0.300,0.4500,0.5900,0.7812,0.1200,0.3400,0.6700,0.8400,0.210,0.2900,0.500,0.6700] positions_array = np.asarray(flat_list, dtype=np.float64).reshape(3,4)
这样也能得到你要的(3,4)数组。
最后验证下,直接喂给神经网络就行
得到正确的数组后,不管是PyTorch还是TensorFlow都能直接用:
# PyTorch例子 import torch input_tensor = torch.tensor(positions_array) # TensorFlow例子 import tensorflow as tf input_tensor = tf.convert_to_tensor(positions_array)
这下就不会报错啦!
内容的提问来源于stack exchange,提问作者Shafa Haider

