在Numpy中矢量化特征值计算

And*_*anu 5 python numpy

我想要一种向量化特征值计算的numpy-sh方式,这样我就可以给它一个矩阵矩阵,它将返回各个特征值的矩阵.

例如,在下面的代码中,B是由3x3矩阵A的4个副本组成的块6x6矩阵.C是我想看到的输出,即维数(2,2,3)的数组(因为A有3个特征值).

这当然是一个非常简化的例子,在一般情况下,矩阵A可以具有任何大小(尽管它们仍然是正方形),并且矩阵B不一定由A 的副本形成,而是不同的A1,A2等(所有相同大小但包含不同的元素).

import numpy as np
A = np.array([[0, 1, 0],
              [0, 2, 0],
              [0, 0, 3]])
B = np.bmat([[A, A], [A,A]])
C = np.array([[np.linalg.eigvals(B[0:3,0:3]),np.linalg.eigvals(B[0:3,3:6])],
              [np.linalg.eigvals(B[3:6,0:3]),np.linalg.eigvals(B[3:6,3:6])]])
Run Code Online (Sandbox Code Playgroud)

ali*_*i_m 6

编辑:如果您使用的是 numpy >= 1.8.0 的版本,则np.linalg.eigvals对您提供的任何数组的最后两个维度进行操作,因此,如果您将输入重塑为数组,(n_subarrays, nrows, ncols)则只需调用eigvals一次:

import numpy as np

A = np.array([[0, 1, 0],
              [0, 2, 0],
              [0, 0, 3]])

# the input needs to be an array, since matrices can only be 2D.
B = np.repeat(A[np.newaxis,...], 4, 0)

# for arbitrary input arrays you could do something like:
# B = np.vstack(a[np.newaxis,...] for a in input_arrays)
# but for this to work it will be necessary for each element in 
# 'input_arrays' to have the same shape

# eigvals will operate over the last two dimensions of the array and return
# a (4, 3) array of eigenvalues
C = np.linalg.eigvals(B)

# reshape this output so that it matches your original example
C.shape = (2, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果您的输入数组并非全部具有相同的维度,例如等input_arrays[0].shape == (2, 2)input_arrays[1].shape == (3, 3)那么您只能在具有匹配维度的子集中对此计算进行向量化。

如果您使用的是较旧版本的 numpy,那么不幸的是,我认为没有任何方法可以对多个输入数组上的特征值的计算进行矢量化 - 您只需在 Python 中循环输入即可。

  • 与 512x512 矩阵的实际处理时间相比,36 次迭代的开销可以忽略不计:使用几个嵌套的 for 循环,或使用“np.vectorize”。如果您有 512x512x6x6,那么您需要切换到 1.8。 (3认同)