Python 是否有一种简单的方法来交换矩阵中的行以形成左侧的标识矩阵
给定一个矩阵a,它可以是正方形,但很可能是矩形;假设一个单位矩阵可以在列(A)最左边的列上形成,那么有没有一种很好的方法可以通过行交换来实现这个单位矩阵呢 例如,从Python 是否有一种简单的方法来交换矩阵中的行以形成左侧的标识矩阵,python,python-3.x,numpy,sorting,Python,Python 3.x,Numpy,Sorting,给定一个矩阵a,它可以是正方形,但很可能是矩形;假设一个单位矩阵可以在列(A)最左边的列上形成,那么有没有一种很好的方法可以通过行交换来实现这个单位矩阵呢 例如,从 import numpy as np row1 = np.array([1, 0, 0, 2, 3]) row2 = np.array([0, 0, 1, 4, 5]) row3 = np.array([0, 1, 0, 6, 7]) A = np.array([row1, row2, row3]) 我想要 row1 = np.a
import numpy as np
row1 = np.array([1, 0, 0, 2, 3])
row2 = np.array([0, 0, 1, 4, 5])
row3 = np.array([0, 1, 0, 6, 7])
A = np.array([row1, row2, row3])
我想要
row1 = np.array([1, 0, 0, 2, 3])
row2 = np.array([0, 1, 0, 6, 7])
row3 = np.array([0, 0, 1, 4, 5])
A = np.array([row1, row2, row3])
我希望这是一般性的,超过1行可能需要交换,并且矩阵的大小没有限制。也不能保证掉期将在相邻行进行。时间无关紧要,即效率不重要。不需要交换列。构成秩(A)单位矩阵的列将显示在左侧
更难的“测试用例”是
请注意,A的洗牌标识部分是酉矩阵 由于恒等矩阵的置换性质,这意味着你可以简单地将
A
乘以A[:行,:行].T
(恒等置换部分):
结果<代码>A=:
array([[1, 0, 0, 2, 3],
[0, 1, 0, 6, 7],
[0, 0, 1, 4, 5]])
谁的行被切换成身份。我有一个解决方案,但它可能(非常)不可选择。请记住,此解决方案取决于与单位矩阵长度对应的行数:
def find_RankA(arr):
identity_len = arr.shape[0]
new_arr = np.empty_like(arr)
for row in arr:
replacement_index = row[:identity_len].tolist().index(1)
new_arr[replacement_index] = row
return new_arr
if __name__ == '__main__':
row1 = np.array([0, 0, 0, 0, 1, 5, 6, 7])
row2 = np.array([0, 0, 1, 0, 0, 1, 4, 2])
row3 = np.array([0, 0, 0, 1, 0, 6, 8, 4])
row4 = np.array([0, 1, 0, 0, 0, 1, 1, 1])
row5 = np.array([1, 0, 0, 0, 0, 6, 8, 4])
A = np.array([row1, row2, row3, row4, row5])
print(find_RankA(A))
(Feedback welcome)
我们可以将功能缩短为:
def find_RankA(arr):
new_arr = np.empty_like(arr)
for row in arr:
new_arr[row[:arr.shape[0]].tolist().index(1)] = row
return new_arr
基于强制排序的方法:
A[np.argsort(np.argmax(A[:,:len(A)], 1))]
这回答了你的问题吗?看看我的答案。Lmk,如果你想要更多的解释。矩阵是保证有满秩的,还是我们必须处理这样的情况,比如说,输入是一个秩为3的4x5矩阵?我对矩阵进行了修剪,使其具有满秩,在这一点上,这不适用于以下情况‘row1=np.array([0,0,0,0,0,1,5,6,7])row2=np.array([0,0,0,1,4,2])row3=np.array([0,0,0,1,0,6,8,4])row4=np.array([0,1,0,0,0,1,1,1])row5=np.array([1,0,0,0,0,6,8,4])A=np array([row1,2,3,4,5])rows=5a[:rows,:rows].dot(A)]这比基于需要复制行的位置的更“直接”洗牌的时间复杂度更高,但是提问者说他们不关心效率。不过,当输入为浮点时,我会有点担心一些矩阵乘法算法的舍入错误。我不知道如何使其更好,但我所做的只是添加两行,并将它们混在一起bit@GeorgeK现在试试吧,我忘了换位了。是的,很好。我也应该能发现这一点。
def find_RankA(arr):
new_arr = np.empty_like(arr)
for row in arr:
new_arr[row[:arr.shape[0]].tolist().index(1)] = row
return new_arr
A[np.argsort(np.argmax(A[:,:len(A)], 1))]