Вычислительная матрица норм без л oop в numpy - PullRequest
1 голос
/ 02 мая 2020

Как вычислить матричные нормы в матрице (100, 8, 8), чтобы у меня в конце был вектор 100 норм? Например, я хочу, чтобы норма каждой матрицы 8x8.

Прямо сейчас я делаю, но это, вероятно, слишком неэффективно и некрасиво

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

Ответы [ 4 ]

5 голосов
/ 02 мая 2020

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])
1 голос
/ 02 мая 2020
list(map(lambda x: np.linalg.norm(x, ord='fro'), mats))
0 голосов
/ 02 мая 2020

Вы можете сделать это с пониманием списка:

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)
0 голосов
/ 02 мая 2020
foo = mats.reshape(100, -1)
np.sqrt(np.diagonal(foo @ foo.T))

(это специально для нормы Фробениуса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...