在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 中实现重复?