По соображениям производительности
Мне любопытно, есть ли способ умножить стек стека матриц. У меня есть 4-мерный массив (500, 201, 2, 2). Его в основном 500-разрядный стек (201,2,2) матриц, где для каждого из 500 я хочу умножить смежные матрицы с использованием einsum и получить другую (201,2,2) матрицу.
Я только умножаю матрицу на матрицах [2x2] в конце. Поскольку мое объяснение уже направлено на рельсы, я просто покажу, что я делаю сейчас, а также эквивалент "уменьшить" и почему его не полезно (потому что его скорость равна вычислительной мощности). Предпочтительно, это будет несколько однострочный, но я не знаю, что это такое, или даже если это возможно.
Код:
Arr = rand(500,201,2,2)
def loopMult(Arr):
ArrMult = Arr[0]
for i in range(1,len(Arr)):
ArrMult = np.einsum('fij,fjk->fik', ArrMult, Arr[i])
return ArrMult
def myeinsum(A1, A2):
return np.einsum('fij,fjk->fik', A1, A2)
A1 = loopMult(Arr)
A2 = reduce(myeinsum, Arr)
print np.all(A1 == A2)
print shape(A1); print shape(A2)
%timeit loopMult(Arr)
%timeit reduce(myeinsum, Arr)
Возврат:
True
(201, 2, 2)
(201, 2, 2)
10 loops, best of 3: 34.8 ms per loop
10 loops, best of 3: 35.2 ms per loop
Любая помощь будет оценена по достоинству. Вещи функциональны, но когда мне приходится перебирать это по большому ряду параметров, код имеет тенденцию занимать много времени, а Мне интересно, есть ли способ избежать 500 итераций через цикл.