Предполагая, что Вы хотели, чтобы форма r
была (M.shape[0],M.shape[0])
.
M = np.random.rand(700,3,3)
t = M.shape[0]
r = np.zeros((t, t))
Это эквивалентно первому утверждению вашего внутреннего цикла
q = M[:,None,...] @ M.swapaxes(1,2)
И это завершает внутренний / внешний цикл
p = np.linalg.norm(q, axis=(2,3))
for i in range(len(r)):
for j in range(len(r[0])):
n = M[i] @ M[j].T
r[i,j] = np.linalg.norm(n)
>>> np.all(np.isclose(p,r))
True
С M.shape -> (70,3,3)
это примерно в 42 раза быстрее, чем цикл for.
С M.shape -> (700,3,3)
это примерно в 36 раз быстрее, чем для цикла.
Мой бедный компьютер не может справиться M.shape --> (7000,3,3)
... MemoryError
.