Quando o ndarray.T é atualizado? [duplicado]
No Numpy, você pode transpor a ndarraycom o transpose()método, mas ele também possui um atributo T.
Quando a ndarrayé alterado, não apenas o valor de retorno do transpose()método, mas também o atributo Té atualizado automaticamente ao mesmo tempo.
ndarray.transpose()é uma função, por isso não é de se admirar. Porém, Tnão é uma função, mas um mero atributo, por isso deve ser atualizado antes de ser acessado.
Todas as funções e métodos Numpy atualizam o
Tatributo sempre que são chamados?Se sim, por quê? É provável que, ao lidar com matrizes enormes, o custo computacional de cada operação seja muito grande, mesmo que não seja relevante para a transposição. Não é mais razoável chamar
transpose()apenas quando necessário, em vez de reescrever oTatributo todas as vezes?
Este é um exemplo simples:
>>> import numpy as np
>>> x = np.array([[1, 2, 3],
... [4, 5, 6]])
...
>>> x
array([[1, 2, 3],
[4, 5, 6]])
>>> x.T
array([[1, 4],
[2, 5],
[3, 6]])
Claro, a operação em xsimultaneamente também muda x.T. Quando foi x.Tatualizado? Fez x.__imul__()isso?
>>> x *= 100
>>> x
array([[100, 200, 300],
[400, 500, 600]])
>>> x.T
array([[100, 400],
[200, 500],
[300, 600]])
Respostas
A Tpropriedade que é igual a .transpose()apenas uma vista com a forma (e passos) alterados. A memória do conteúdo real é a mesma (você pode usar um id(x[0,0])e id(x.T[0,0])por exemplo para verificar isso), mas as propriedades do objeto informam numpycomo interpretá-lo. Para uma matriz 2D, os passos e a forma são apenas o reverso da matriz original. Para ler mais sobre strides, consulte os documentos . É por isso que as coisas são imediatas quando o conteúdo muda - a célula da memória obtém o novo número, mas a interpretação da .Tmatriz não muda.