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

Sorted list of matrices ordered by their determinant in 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)