`np.tensordot` fornece uma maneira flexível de executar contrações tensoras (produtos de pontos generalizados) em Numpy, significativamente mais eficientemente do que a implementação manual de loops aninhados para tensores maiores. Sua eficiência decorre de alavancar blas otimizadas (subprogramas básicos de álgebra linear) sob o capô.
Veja como `np.tensordot` funciona e como usá -lo com eficiência:
Entendendo o parâmetro dos eixos: O núcleo do `np.tensordot` está em seu parâmetro` axes`. Este parâmetro especifica quais eixos das matrizes de entrada (`a` e` b`) devem ser resumidas durante o produto DOT. Pode ser:
*
Um número inteiro: Isso especifica o número de eixos para resumir a partir da extremidade * de cada matriz. Se `eixos =1`, ele resume o último eixo de` a` e o último eixo de `b`. Se `eixos =2`, resume os dois últimos eixos de cada um e assim por diante. Esta é a forma mais simples.
*
Uma tupla de duas seqüências: Isso fornece mais controle. Cada sequência especifica os eixos de `a` e` b`, respectivamente, que devem ser contratados (somados). Os comprimentos das seqüências devem ser iguais.
Exemplos: 1.
Produto de ponto simples (multiplicação da matriz): `` `Python
importar numpy como np
a =np.array ([[1, 2], [3, 4]]))
b =np.array ([[5, 6], [7, 8]]))
Multiplicação de matriz padrão (eixos =1 implicitamente)
c =np.tensordot (a, b, eixos =1) # equivalente a np.dot (a, b)
Imprimir (c) # Saída:[[19 22] [43 50]]
Especificando eixos explicitamente
c =np.tensordot (a, b, machado =((1), (0)) #same como acima
Imprimir (c) # Saída:[[19 22] [43 50]]
`` `
2.
contração tensor com tensores de ordem superior: `` `Python
a =np.Arange (24) .Reshape ((2,3,4))
b =np.Arange (24) .Reshape ((4,3,2))
soma sobre o último eixo de 'a' e o primeiro eixo de 'b'
c =np.tensordot (a, b, eixos =([2], [0]))
Imprimir (c.Sape) # Saída:(2, 3, 3, 2)
#Mais contração complexa:
c =np.tensordot (a, b, eixos =([(0,2)], [(1,0)]))))
Imprimir (c.Sape) #Output:(3, 2)
`` `
3.
notação de soma einstein equivalente: `np.tensordot` realiza efetivamente operações semelhantes à notação de soma de Einstein. Por exemplo, se `a` é (i, j, k) e` b` é (k, l), então a contração sobre `k` pode ser escrita como:
`C_ {ijl} =\ sum_k a_ {ijk} b_ {kl}`
Isso pode ser realizado com eficiência com:
`` `Python
a =np.random.rand (2,3,4)
b =np.random.rand (4,5)
c =np.tensordot (a, b, eixos =([2], [0]))
Imprimir (c.Sape) # Saída:(2, 3, 5)
`` `
considerações de eficiência: *
Ordem dos eixos: A ordem em que você especifica os eixos pode afetar o desempenho. As otimizações internas de Numpy podem ser mais eficazes com certas ordens. Experimente encontrar a configuração mais rápida para seus tensores específicos.
*
Uso da memória: Para tensores extremamente grandes, `np.tensordet` pode levar a problemas de memória. Nesses casos, considere o uso de métodos ou bibliotecas iterativas projetadas para operações de tensor em larga escala (como Tensorflow ou Pytorch), que geralmente têm melhores estratégias de gerenciamento de memória.
*
Alternativa para casos simples: Para produtos de ponto simples ou multiplicações de matriz, `np.dot` ou`@`operador geralmente são mais rápidas que` np.tensordot`.
Em resumo, `np.tensordot` é uma ferramenta poderosa, mas entender o parâmetro` machado` é crucial para o uso eficiente e correto. Escolha o método certo com base na complexidade das operações do tensor e no tamanho dos seus dados para otimizar o uso de velocidade e memória.