我需要按特征值幅度的降序对特征值 - 特征向量对进行排序,有时我(〜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结果 - 该部分后面的数学检查。奇怪的是,当代码工作时,它可以工作 - 我得到了预期的结果。
答案 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的元组。当第一项的顺序清楚时,忽略排序,但在使用第二项解决关系时产生错误。
我猜测你的排序在特征值是唯一的时候很好,但是当有重复并且它试图对数组进行排序时就失败了。