Python中按行列式排序的矩阵的排序列表



我试图保持矩阵的有序列表,其中排序是由行列式的绝对值给出的。

要做到这一点,我考虑在sortedcontainers包中使用SortedKeyList对象。我的代码如下:
import numpy as np
import numpy.linalg as la
from sortedcontainers import SortedKeyList
def random_mat(n):
return np.random.randint(0,5,n*n)
def abs_det(M):
n = np.int(np.sqrt(len(M)))
return np.abs(la.det(M.reshape((n,n)))
L = SortedKeyList([random_mat(3): i in range(10)], key=abs_det)
# So far this doesn't give me any issues. Updating the list is the problem:
M = np.array([0,1,2,1,0,2,2,1,0])
L.update(M) #This gives me an error

错误出现在函数abs_det中,它说它不能取整数(numpy.int32)的长度,我怀疑在比较数组时,排序列表不是将数组作为一个整体,而是使用键函数。最初我试图使用数组作为矩阵的形状(n,n),但当包括它们在排序列表的形状会丢失,它们被存储为数组导致其他问题时,试图比较它们。

排序字典不能解决这个问题,因为我感兴趣的是取列表的范围。

有什么方法可以保持一个矩阵的排序列表按其行列式的绝对值排序?也许在Python中有另一个排序列表的实现可以处理这些类型的对象?

SortedKeyList。update期望得到一个可迭代对象,因此它遍历M中的所有单个整数,并将每个整数添加到已排序的容器中。

从sortedlist.py中的文档字符串

def update(self, iterable):
"""Update sorted list by adding all values from `iterable`.

如果您将该行更改为

,它似乎可以正常工作。
L.update([M])

添加单个条目的方法是add(感谢Kelly Bundy)

L.add(M)

最新更新