【问题标题】:Roulette Wheel Selection : unsupported operand type(s) for &: 'numpy.float64' and 'numpy.float64'轮盘选择:& 不支持的操作数类型:“numpy.float64”和“numpy.float64”
【发布时间】:2018-06-19 08:56:35
【问题描述】:

我正在 python 中使用轮盘赌构建遗传算法的父选择。

acc['left'] 是左边界,acc['right'] 是每个个体概率累积的右边界。 rw是轮盘的随机数,n_rwrw的数。

这是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] &gt; acc['left'][o]) &amp; (rw[b] &lt;= acc['right'][o]))。对于 numpy 数组,&amp; 运算符优先于比较运算符,因此您需要用括号/括号括起您的比较。
  • @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() 来获得一个布尔变量。然后您可以将其评估为TrueFalse
  • @Dorian 在上面的代码中很好,rw 是一个系列或一个 numpy 数组,但它是线性的并且被索引,而acc 被列和行索引,所以我不知道为什么 OP 会为 acc['left'][o] 获得一个系列,两者都应该是 numpy.float64 数字。
  • rw 到底是什么?它是一个数据框吗?请提供最小代码,以便有人可以运行它并产生相同的错误。

标签: python numpy roulette-wheel-selection


【解决方案1】:

在你的情况下,这样的事情应该可以完成:

acc['parent'] = np.full(pop_size, False, dtype=bool)
o = 0

while o < pop_size:
    b = 0
    while b < n_rw:
        acc.loc[o,'parent'] = ((rw[b] > acc['left'][o]) & (rw[b] <= acc['right'][o]))

现在您正在写入 DataFrame 并实际更改先前启动的值。

        if acc.loc[o,'parent'] == True:
            break
        else:
            b = b+1
    o = o+1
print acc

但是,我不确定您的代码在做什么。

【讨论】:

  • 每行都会产生false
  • 我更正了代码,你还要索引条件值的初始化acc['parent'][o];现在还是不行吗?
  • 现在每行都会产生0.0
  • 因为您定义的是 float64 数组,而不是 numpy 中的布尔数组。应该是这样的:np.empty((1, pop_size), dtype=bool) 我们越来越近了;)另外:你增加o 太早了。它应该发生在 while 语句的末尾,否则您将跳过索引 0 并得到最后一个错误的结果。 (我修好了)
  • 结果:ValueError: Length of values does not match length of index 对不起,我还是个新手。
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2016-10-15
  • 2019-10-11
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多