【发布时间】:2018-06-19 08:56:35
【问题描述】:
我正在 python 中使用轮盘赌构建遗传算法的父选择。
acc['left'] 是左边界,acc['right'] 是每个个体概率累积的右边界。 rw是轮盘的随机数,n_rw是rw的数。
这是acc 数据框:
accuracy rank prob_fitness left right
0 0.825152 6.0 0.109091 0.000000 0.109091
1 0.839545 9.0 0.163636 0.109091 0.272727
2 0.807727 2.5 0.045455 0.272727 0.318182
3 0.840000 10.0 0.181818 0.318182 0.500000
4 0.807727 2.5 0.045455 0.500000 0.545455
5 0.820152 4.0 0.072727 0.545455 0.618182
6 0.832576 8.0 0.145455 0.618182 0.763636
7 0.821364 5.0 0.090909 0.763636 0.854545
8 0.802727 1.0 0.018182 0.854545 0.872727
9 0.829091 7.0 0.127273 0.872727 1.000000
这是rw:
'array([ 0.89676, 0.8007 , 0.35212, 0.08043, 0.51044, 0.61213, 0.3392 , 0.96687, 0.2554 , 0.97215])'
我正在尝试使用此代码确定哪一个将是父候选人。但它不起作用。
acc['parent'] = np.zeros(pop_size)
o = 0
b = 0
while o < pop_size:
o = o+1
while b < n_rw:
acc['parent'] = (rw[b] > acc['left'][o] & rw[b] <= acc['right'][o])
if acc['parent'] == True:
b = n_rw
else:
b = b+1
acc
结果:
TypeError: &: 'numpy.float64' 和 'numpy.float64' 的操作数类型不受支持
你能帮帮我吗?提前致谢
【问题讨论】:
-
使用
((rw[b] > acc['left'][o]) & (rw[b] <= acc['right'][o]))。对于 numpy 数组,&运算符优先于比较运算符,因此您需要用括号/括号括起您的比较。 -
@AlexanderReynolds 我试过了,结果:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() -
@user119420 是的,因为您正在比较两个完整的数组,这会产生一个布尔向量(如果我错了,请纠正我)。我不能 100% 确定您要达到的目标,但您应该在布尔数组上使用
.any()或.all()来获得一个布尔变量。然后您可以将其评估为True或False -
@Dorian 在上面的代码中很好,
rw是一个系列或一个 numpy 数组,但它是线性的并且被索引,而acc被列和行索引,所以我不知道为什么 OP 会为acc['left'][o]获得一个系列,两者都应该是numpy.float64数字。 -
rw到底是什么?它是一个数据框吗?请提供最小代码,以便有人可以运行它并产生相同的错误。
标签: python numpy roulette-wheel-selection