Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种简单的方法来交换矩阵中的行以形成左侧的标识矩阵_Python_Python 3.x_Numpy_Sorting - Fatal编程技术网

Python 是否有一种简单的方法来交换矩阵中的行以形成左侧的标识矩阵

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

给定一个矩阵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.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))]