如何找到矩形矩阵的列空间的基础?

时间:2017-03-17 21:38:15

标签: numpy

给定尺寸为m乘n的n ndarray(其中n> m),如何找到线性独立的列?

2 个答案:

答案 0 :(得分:1)

一种方法是使用LU decomposition。因子U将与您的矩阵具有相同的大小,但将是上三角形。在U的每一行中,选择第一个非零元素:这些是枢轴元素,属于线性独立列。一个独立的例子:

import numpy as np
from scipy.linalg import lu
A = np.array([[1, 2, 3], [2, 4, 2]])     # example for testing 
U = lu(A)[2]
lin_indep_columns = [np.flatnonzero(U[i, :])[0] for i in range(U.shape[0])]

输出:[0,2],表示A的第0列和第2列构成其列空间的基础。

答案 1 :(得分:0)

@user6655984 的回答启发了这段代码,在那里我开发了一个函数而不是作者的最后一行代码(查找 U 的枢轴列),以便它可以处理更多不同的 A。

这是:

import numpy as np
from scipy import linalg as LA

np.set_printoptions(precision=1, suppress=True)

A = np.array([[1, 4, 1, -1],
              [2, 5, 1, -2],
              [3, 6, 1, -3]])

P, L, U = LA.lu(A)

print('P', P, '', 'L', L, '', 'U', U, sep='\n')

输出:

P
[[0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]]

L
[[1.  0.  0. ]
 [0.3 1.  0. ]
 [0.7 0.5 1. ]]

U
[[ 3.   6.   1.  -3. ]
 [ 0.   2.   0.7 -0. ]
 [ 0.   0.  -0.  -0. ]]

我想出了这个函数:

def get_indices_for_linearly_independent_columns_of_A(U: np.ndarray) -> list:
    
    # I should first convert all "-0."s to "0." so that nonzero() can find them.
    U_copy = U.copy()
    U_copy[abs(U_copy) < 1.e-7] = 0

    # Because some rows in U may not have even one nonzero element,
    # I have to find the index for the first one in two steps.
    index_of_all_nonzero_cols_in_each_row = (
        [U_copy[i, :].nonzero()[0] for i in range(U_copy.shape[0])]
    )
    index_of_first_nonzero_col_in_each_row = (
        [indices[0] for indices in index_of_all_nonzero_cols_in_each_row
         if len(indices) > 0]
    )

    # Because two rows or more may have the same indices
    # for their first nonzero element, I should remove duplicates.
    unique_indices = sorted(list(set(index_of_first_nonzero_col_in_each_row)))
    return unique_indices

最后:

col_sp_A = A[:, get_indices_for_linearly_independent_columns_of_A(U)]
print(col_sp_A)

输出:

[[1 4]
 [2 5]
 [3 6]]