Python-linalg.eigsh如何找到*所有*特征向量?

时间:2018-10-08 17:53:38

标签: python sparse-matrix eigenvalue eigenvector

我正在linalg.eigshhere的文档编制页面上使用示例代码:

import scipy.sparse.linalg as sp
import numpy as np

id = np.eye(13)
vals, vecs = sp.eigsh(id, k=6)

len(vals)
# 6
len(vecs)
# 13

我要求它提供6个特征值(k=6),但它确实返回6,但是它给了我13个(即 all )特征向量。
在文档中,当谈到k时,它说:

  

所需的特征值和特征向量的数量。 k必须更小   比N还要大。不可能计算矩阵的所有特征向量。

实际上,我认为eighsh底层的Lanczos方法的速度是由于它只发现了eigvector的一个子集。

那么如何返回所有特征向量?

2 个答案:

答案 0 :(得分:1)

不是; vecs是13 x 6的矩阵。特征向量n为:

import datetime

# Example from your comment:
type1 = "some type"
main_list = [[], [],
             [[1, 2, 3, datetime.date(2016, 8, 18), type1],
              [3, 4, 5, datetime.date(2016, 8, 18), type1]], [], []]


def fmt_times(lst):
    """Format the fourth value of each element of each non-empty sublist"""
    for i in range(len(lst)):
        if lst[i] != []:
            for j in range(len(lst[i])):
                lst[i][j][3] = lst[i][j][3].strftime('%Y-%m-%d')
    return lst


def fmt_times_one_line(main_list):
    """Format the fourth value of each element of each non-empty sublist"""
    return [[] if main_list[i] == [] else [[main_list[i][j][k] if k != 3 else main_list[i][j][k].strftime('%Y-%m-%d') for k in range(len(main_list[i][j]))] for j in range(len(main_list[i])) ] for i in range(len(main_list))]

import copy

# Deep copy needed because fmt_times modifies the sublists.
assert fmt_times(copy.deepcopy(main_list)) == fmt_times_one_line(main_list)

答案 1 :(得分:0)

您误解了结果。特征向量是vecs,但是您要对行进行计数。 vecs共有六列。