将含8×8子数组的列表转为np.array时出现非均匀形状错误
错误原因及解决办法
你遇到的这个ValueError,核心原因是numpy无法将混合了标量和多维数组的列表转换为同构的多维数组。
你的列表每个元素是[整数, 整数, 8×8二维数组],当执行np.array()时,numpy会尝试把整个列表解析成一个统一形状的数组:
- 前两个元素是0维的标量,第三个是2维的
(8,8)数组 - numpy试图把这三个元素放在同一个维度下,但标量和二维数组的维度不匹配,导致无法形成均匀的形状结构,所以报错提示“
(31, 3) + 不均匀部分”——这里的(31,3)是31个元素每个有3个项,但第三个项的维度和前两个不一致,造成了形状不均匀。
解决思路
你可以根据需求选择以下两种方式处理:
构造结构化数组:明确指定每个字段的类型,让numpy能正确识别混合类型的结构
import numpy as np # 定义结构化数据类型:两个int,一个(8,8)的int数组 dtype = [('a', int), ('b', int), ('board', int, (8,8))] finBlackSourceMoves_arr = np.array(finBlackSourceMoves, dtype=dtype)这样生成的数组每个元素会包含三个字段,你可以通过
finBlackSourceMoves_arr['a']、finBlackSourceMoves_arr['board']分别访问对应部分。拆分数据为独立数组:把三个部分分别提取成单独的numpy数组,适合不需要保持元素关联性的场景
int1s = np.array([item[0] for item in finBlackSourceMoves]) int2s = np.array([item[1] for item in finBlackSourceMoves]) boards = np.array([item[2] for item in finBlackSourceMoves])最后
boards会是形状为(31,8,8)的数组,两个整数数组是(31,)的一维数组。
内容的提问来源于stack exchange,提问作者Oleksandr Nekrashevych
相关产品推荐
相关产品推荐

