Python:调用list.sort()时,得到关于歧义的ValueError?

时间:2016-04-07 22:50:12

标签: python python-2.7 sorting numpy

我需要按特征值幅度的降序对特征值 - 特征向量对进行排序,有时我(〜1/3的时间)在调用.sort()函数时会出现以下错误:

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

在eigenPairs.sort()调用上生成错误的代码是这样的:

eigenPairs = []  # list of tuples of (eigenVal, eigenVect)
for i in range(len(eigenVals)):
    eigenPairs.append((eigenVals[i], eigenVects[:, i]))

eigenPairs.sort()  
eigenPairs.reverse()

eigenVals和eigenVects变量基本上是在自定义方法中实现的矩阵上的SVD结果 - 该部分后面的数学检查。奇怪的是,当代码工作时,它可以工作 - 我得到了预期的结果。

1 个答案:

答案 0 :(得分:0)

关于此ValueError有很多问题。它是在Python上下文中使用numpy布尔数组的结果,它需要一个标量布尔值。最常见的是if x:..声明。在这里,我怀疑它是在包含数组的列表上执行列表排序的结果。

将其更改为列表或元组列表,定义功能比较函数或键,或切换到数组排序。

例如,尝试仅对元组的第一个元素进行排序,这是一个标量。

第二个元素的大小是什么?特征向量?运行时的情况与发生故障时的情况有何不同?

我打赌你可以在数组中累积特征值并对其进行排序。或者argsort

  sorted(L, key=operator.itemgetter(0))

会将排序限制为元组的第一项

https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

https://wiki.python.org/moin/HowTo/Sorting/#Operator_Module_Functions

我在第二个插槽中尝试了包含None的元组。当第一项的顺序清楚时,忽略排序,但在使用第二项解决关系时产生错误。

我猜测你的排序在特征值是唯一的时候很好,但是当有重复并且它试图对数组进行排序时就失败了。