按 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)
我正在尝试保留矩阵的有序列表,其中排序由行列式的绝对值给出。
为此,我考虑过使用 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)