排序方法:具有多个元素的数组的真实值是模棱两可的。使用a.any()或a.all()。

9

我在使用sorted()方法时遇到了问题。我正在循环中使用这个方法来对一个列表进行排序,而我在每一步循环中都在升级这个列表。第一次迭代可以正常工作,但是从第二次开始就不能工作,并给出以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

以下是我的代码:

import numpy as np
import random as rd
import math

Poblacion = 10
pressure = int(0.3*Poblacion)
mutation_chance = 0.08

Modelo = np.array([[0.60,0.40,0.90],[0.26,0.20,0.02],[0.80,0.00,0.05]])

x = np.array([[1.0,2.0,3.0],[0.70,0.50,0.90],[0.10,0.40,0.20]])
y = np.array([[4.10,0.72,2.30],[1.43,0.30,1.01],[0.40,0.11,0.18]])

def crearIndividuo():
    return[np.random.random((3, 3))]

def crearPoblacion(): 
    return [crearIndividuo() for i in range(Poblacion)]

def calcularFitness(individual): 
    error = 0
    i=0
    for j in x:
        error += np.array(individual).dot(j)-y[i]
        i += 1
        error = np.linalg.norm(error,ord=1) 
        fitness = math.exp(-error)
    return fitness

def selection_and_reproduction(population):
    puntuados = [ (calcularFitness(i), i) for i in population] 
    puntuados = [i[1] for i in sorted(puntuados)] 
    population = puntuados

    selected =  puntuados[(len(puntuados)-pressure):] 

    j=0
    while (j < int(len(population)-pressure)):
        padre = rd.sample(selected, 2)

        population[j] = 0.5*(np.array(padre[0]) + np.array(padre[1]))
        j += 1
        population[j] = 1.5*np.array(padre[0]) - 0.5*np.array(padre[1])
        j += 1
        population[j] = -0.5*np.array(padre[0]) + 1.5*np.array(padre[1])
        j += 1
    return population

population = crearPoblacion()

for l in range(3):
    population = selection_and_reproduction(population)

print("final population: ", population)

错误出现在这一行:
puntuados = [i[1] for i in sorted(puntuados)] 

我不知道我做错了什么(我不是Python专家)。有人能帮我吗?
提前感谢。

看起来 puntuados 是一个元组列表。请参考这个SO问题以了解如何正确使用 sorted - Stuti Rastogi
当布尔数组在需要简单的True/False值的上下文中使用时,会引发此错误。在这里,它似乎是排序所需的比较。例如,如果x或y是numpy数组,则像x<y这样的测试会产生一个布尔数组。尝试例如np.array([1,2,3])<3 - hpaulj
请注意侧边栏显示了许多关于相同错误信息的SO问题。特别注意puntuados在每次迭代中的变化。当它工作时是什么样子的,而当它不工作时又有何不同。 - hpaulj
@hpaulj 我使用了"type(puntuados)",在两次迭代中都给出了"<class 'list'>"。我还检查了pupolation的类型和长度(在两次迭代中它们都是列表,长度为10)。有时候代码可以完成第二次迭代,但会卡在第三次迭代中。 - Ivanovitch
1
@StutiRastogi 非常感谢!那篇文章帮助我解决了我的问题。 - Ivanovitch
1个回答

13

当元组具有相同的第一个元素时,问题就会出现,因此

sorted(puntuados)

需要比较两个元组的第二个元素以确定它们的相对顺序,此时您遇到了此异常。

您可以使用

sorted(graded, key=lambda x: x[0])

如果您只想根据元组的第一个元素进行排序,那么解决问题的方法如下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接