NumPy追加3D列表矩阵报形状不匹配广播错误
错误成因
报错本质是NumPy赋值时维度不匹配,触发广播失败:
- 你的
matlist(即传入selection的population参数)中存储的每个个体是形状为(3,5)的二维矩阵(对应3个任务、5个传感器节点),整个种群共5个个体,整体为3D结构。 - selection函数中初始化
parents数组时,错误设置形状为(num_parents, len(population))即(2,5),导致每个行切片parents[i, :]是长度为5的一维数组。 - 你尝试将形状为
(3,5)的完整个体矩阵赋值给长度为5的一维切片时,NumPy无法按广播规则完成维度匹配,因此抛出ValueError。 - 之前注释掉的
parents[i, :] = population[max_fitness_idx[0][0]][2]能运行,是因为你只取了个体矩阵的第3行(形状为(5,)),刚好和切片维度匹配,所以只能存入单行数据。 - 附带隐性问题:原crossover函数按2D数组逻辑编写,即使修正selection的维度,后续交叉逻辑也会因为维度不匹配报错;另外原代码中无效节点置零部分误用双等号
==(比较运算),导致置零逻辑完全不生效。
修复方案
- 修正selection函数的数组初始化逻辑,对齐个体维度
初始化parents时,形状要匹配「父代数量 + 单个个体的矩阵形状」,修改后代码如下:def selection(fitness, num_parents, population): fitness = list(fitness) # 对齐形状:num_parents个父代,每个父代形状和种群内个体一致 parents = numpy.empty((num_parents, *population[0].shape), dtype=int) for i in range(num_parents): max_fitness_val = numpy.max(fitness) max_fitness_idx = numpy.where(fitness == max_fitness_val)[0][0] parents[i] = population[max_fitness_idx] fitness[max_fitness_idx] = -999999 return parents - 修正crossover函数,适配3D数组结构
调整offsprings初始化形状,交叉操作按任务维度逐行处理即可,修改后代码如下:def crossover(parents, num_offsprings): # 适配3D结构初始化子代 offsprings = numpy.empty((num_offsprings, *parents.shape[1:]), dtype=int) # 沿节点维度计算交叉点 crossover_point = int(parents.shape[-1] / 2) crossover_rate = 0.5 i = 0 while i < num_offsprings: parent1_idx = i % parents.shape[0] parent2_idx = (i + 1) % parents.shape[0] if random.random() > crossover_rate: i += 1 continue # 逐行完成片段交叉 offsprings[i, :, :crossover_point] = parents[parent1_idx, :, :crossover_point] offsprings[i, :, crossover_point:] = parents[parent2_idx, :, crossover_point:] i += 1 return offsprings - 修正无效节点置零的笔误
将原代码中三处init_pop[x][i] == 0的双等号改为单等号=,否则赋值逻辑不会生效。
内容的提问来源于stack exchange,提问作者Atraxia
相关产品推荐
相关产品推荐

