Quando viene aggiornato ndarray.T? [duplicare]

Sep 24 2020

In Numpy, puoi trasporre a ndarraycon il transpose()metodo, ma ha anche un attributo T.

Quando a ndarrayviene modificato, non solo il valore di ritorno del transpose()metodo, ma anche l'attributo Tviene aggiornato automaticamente allo stesso tempo.

ndarray.transpose()è una funzione, quindi non c'è da meravigliarsi. Tuttavia, Tnon è una funzione, ma un semplice attributo, quindi deve essere aggiornato prima dell'accesso.

  1. Tutte le funzioni e i metodi di Numpy aggiornano l' Tattributo ogni volta che vengono chiamati?

  2. In caso affermativo, perché? È probabile che, quando si gestiscono matrici enormi, il costo computazionale di ogni operazione sarebbe molto elevato anche se non è rilevante per la trasposizione. Non è più ragionevole chiamare transpose()solo quando necessario invece di riscrivere l' Tattributo ogni volta?

Questo è un semplice esempio:

>>> 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]])

Ovviamente xcambia x.Tanche il funzionamento simultaneo . Quando è stato x.Taggiornato? L'hai x.__imul__()fatto?

>>> x *= 100
>>> x
array([[100, 200, 300],
       [400, 500, 600]])
>>> x.T
array([[100, 400],
       [200, 500],
       [300, 600]])

Risposte

1 kabanus Sep 23 2020 at 22:24

La Tproprietà che è la stessa di .transpose()è solo una vista con la forma (e le falcate) cambiate. La memoria del contenuto effettivo è la stessa (puoi usare id(x[0,0])e id(x.T[0,0])per esempio per verificarlo), ma le proprietà dell'oggetto dicono numpycome interpretarlo. Per un array 2D, i passi e la forma sono esattamente l'opposto dell'array originale. Per saperne di più sui passi vedere i documenti . Questo è il motivo per cui le cose sono immediate quando il contenuto cambia: la cella di memoria riceve il nuovo numero, ma l'interpretazione .Tdell'array non cambia.