在numpy中计算没有循环的矩阵范数

Posted

技术标签:

【中文标题】在numpy中计算没有循环的矩阵范数【英文标题】:Computing matrix norms without loop in numpy 【发布时间】:2020-05-01 21:56:05 【问题描述】:

如何计算 (100, 8, 8) 矩阵内的矩阵范数,以便最后有 100 个范数列表向量?例如,我想要每个 8x8 矩阵的范数。

现在可以,但是可能效率太低太丑了

norms = []
for m in mats:
    norms.append(np.linalg.norm(m, ord='fro'))

【问题讨论】:

【参考方案1】:

numpy.linalg.norm 接受一个 axis 参数,该参数可以是一个包含两个轴的元组,这些轴包含矩阵。所以你的计算很简单

norms = np.linalg.norm(m, ord='fro', axis=(1, 2))

例如,

In [43]: import numpy as np

In [44]: rng = np.random.default_rng()

In [45]: m = rng.uniform(0, 3, size=(10, 8, 8))

In [46]: norms = np.linalg.norm(m, ord='fro', axis=(1, 2))

In [47]: norms
Out[47]: 
array([15.43326187, 12.18174753, 12.72366662, 14.20558871, 14.08558457,
       13.51040102, 13.38476228, 14.3334069 , 15.19745515, 14.46134742])

【讨论】:

【参考方案2】:
list(map(lambda x: np.linalg.norm(x, ord='fro'), mats))

【讨论】:

【参考方案3】:
foo = mats.reshape(100, -1)
np.sqrt(np.diagonal(foo @ foo.T))

(这是专门针对 Frobenius 范数的)。

【讨论】:

【参考方案4】:

您可以通过列表推导来做到这一点:

norms = [np.linalg.norm(m, ord='fro') for m in mats]

或者numpy.vectorize:

@np.vectorize
def my_fun(m):
    return np.linalg.norm(m, ord='fro')

norms = my_fun(mats)

【讨论】:

以上是关于在numpy中计算没有循环的矩阵范数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在没有 for 循环的情况下在 numpy 中实现重复?

MATLAB中向量数组的向量范数

python与数据分析Numpy数值计算基础——补充

numpy求矩阵范数 ||x|| (np.linalg.norm)

numpy.linalg.norm(求范数)

29、评估多分类问题--混淆矩阵和F分数