Estou tentando multiplicar duas matrizes no numpy com dimensionalidade bastante grande. Veja os 3 métodos abaixo. Eu percebo as 3 matrizes aleatoriamente para mostrar meu problema. A primeira matriz, ou seja, Y1[:,:,0]
é parte de uma matriz 3D maior no início. A segunda é uma .copy()
dessa matriz e a terceira é sua própria matriz.
Por que a primeira multiplicação é muito mais lenta que as duas segundas?
import numpy as np
from time import time
Y1 = np.random.uniform(-1, 1, (5000, 1093, 201))
Y2 = Y1[:,:,0].copy()
Y3 = np.random.uniform(-1, 1, (5000, 1093))
W = np.random.uniform(-1, 1, (1093, 30))
# method 1
START = time()
Y1[:,:,0].dot(W)
END = time()
print(f"Method 1 : {END - START}")
# method 2
START = time()
Y2.dot(W)
END = time()
print(f"Method 2 : {END - START}")
# method 3
START = time()
Y3.dot(W)
END = time()
print(f"Method 3 : {END - START}")
Os tempos de saída são aproximadamente 34, 0,06 e 0,06 segundos, respectivamente.
Vejo a diferença: enquanto as duas últimas matrizes são matrizes 2D "reais", a primeira é uma fatia da minha matriz 3D maior.
É o subconjunto Y1[:,:,0]
que o torna tão lento? Além disso, notei que criar a cópia de Y1 para a matriz Y2 também é bem lento.
Afinal, recebo esta matriz 3D e tenho que calcular repetidamente o produto matricial das fatias de Y1 com uma matriz W (potencialmente diferente). Existe uma maneira melhor/mais rápida de fazer isso?
Desde já, obrigado!