gpt4 book ai didi

python - 使用 NumPy 从特征值创建 Jordan 矩阵

转载 作者:行者123 更新时间:2023-12-02 11:37:24 26 4
gpt4 key购买 nike

我有特征值及其重数的ndarray(例如,np.array([(2.2, 2), (3, 3), (5, 1)]))。我需要计算该特征值的 Jordan 矩阵,而不使用 Python 循环和迭代(列表推导式、for 循环等),而仅使用 NumPy 的函数。

我决定通过以下步骤构建矩阵:

  1. 使用 np.vectorizenp.eye 以及 np.fill_diagonal 创建此 block :

Parts

  • 使用 hstackvstack 将 block 组合成一个矩阵。
  • 但是我有两个问题:

    1. 这是我的 block 创建代码片段:
    def eye(t):
    eye = np.eye(t[1].astype(int),k=1)
    return eye

    def jordan_matrix(X: np.ndarray) -> np.ndarray:
    dim = np.sum(X[:,1].astype(int))
    eyes = np.vectorize(eye, signature='(x)->(n,m)')(X)
    return eyes

    我收到错误 ValueError: 无法将输入数组从形状 (3,3) 广播到形状 (2,2)

  • 我需要创建额外的零矩阵来填充创建的 block 未使用的空间,但它们的大小是可变的,我无法弄清楚如何在不使用Python的for及其的情况下创建它们等价物。
  • 我走的路对吗?我怎样才能摆脱这个问题?

    最佳答案

    np.vectorize 基本上会在引擎盖下循环。我们可以使用 NumPy 函数在 Python 级别进行实际矢量化。这是一种这样的方法 -

    def blockwise_jordan(a):
    r = a[:,1].astype(int)
    v = np.repeat(a[:,0],r)
    out = np.diag(v)
    n = out.shape[1]

    fillvals = np.ones(n, dtype=out.dtype)
    fillvals[r[:-1].cumsum()-1] = 0
    out.flat[1::out.shape[1]+1] = fillvals
    return out

    示例运行 -

    In [52]: X = np.array([(2.2, 2), (3, 3), (5, 1)])

    In [53]: blockwise_jordan(X)
    Out[53]:
    array([[2.2, 1. , 0. , 0. , 0. , 0. ],
    [0. , 2.2, 0. , 0. , 0. , 0. ],
    [0. , 0. , 3. , 1. , 0. , 0. ],
    [0. , 0. , 0. , 3. , 1. , 0. ],
    [0. , 0. , 0. , 0. , 3. , 0. ],
    [0. , 0. , 0. , 0. , 0. , 5. ]])

    优化#1

    我们可以替换最后三个步骤来执行 1 和 0 的条件赋值,就像这样 -

    out.flat[1::n+1] = 1
    c = r[:-1].cumsum()-1
    out[c,c+1] = 0

    关于python - 使用 NumPy 从特征值创建 Jordan 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632361/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com