Quando o ndarray.T é atualizado? [duplicado]

Sep 24 2020

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.

  1. Todas as funções e métodos Numpy atualizam o Tatributo sempre que são chamados?

  2. 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 o Tatributo 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

1 kabanus Sep 23 2020 at 22:24

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.