Assegnazione di variabili (scalari e matrici) in Python

2

Ecco i due casi in esame. (a) Scalari e (b) matrici di Numpy. La mia domanda riguarda l'inizializzazione e l'assegnazione.

1 Perfetto

y = x = 0;
x = 7
print(x,y)
y = 8 
print(x,y)    
x=10
print( x,y)

l'output è perfettamente a posto. L'effetto di y = x = 0 non è visto.

7 0
7 8
10 8

2 Perfetto

import numpy as np
n=3
#d11 = d =np.zeros(n)#.reshape(-1,1) ;
d11 = np.zeros(n); d =np.zeros(n)

for j in np.arange(0, n, 1):            
    d11[j] = j**3 
    d[j] = j**2

print (d11, d   )

l'output è perfettamente a posto, poiché d11 e d sono inizializzati separatamente.

[ 0.  1.  8.] [ 0.  1.  4.]

3 Ambiguo

import numpy as np
n=3
d11 = d =np.zeros(n)#.reshape(-1,1) ;
#d11 = np.zeros(n); d =np.zeros(n)

for j in np.arange(0, n, 1):            
    d11[j] = j**3 
    d[j] = j**2

print (d11, d   )

l'output non è corretto, poiché d11 e d sono inizializzati ed equisiti. Sebbene aggiorni d11 e d separatamente, ci si identifica a vicenda con l'aggiornamento più recente. L'output va così:

[ 0.  1.  4.] [ 0.  1.  4.]

Query:

Initializing multiple variables with a single line is working fine on scalars (y = x = 0) , but not on matrices (d11 = d =np.zeros(n))?

Is there something wrong with my coding or understanding ? This is not the case with Matlab. Why d11 = d is taking effect in case 3, though they are being updated at different stages/lines.

Case 3 can be considered as bad programming skill ?. I dont see any use of this kind of functionality from any programming language ?

Per favore, illuminami. Mi sono appena trasferito da MATLAB a Python. Quindi ho ottenuto questa domanda fondamentale.

Grazie in anticipo per la tua attenzione.

    
posta learner123 14.07.2016 - 10:08
fonte

1 risposta

1

Questa è la differenza tra un oggetto immutabile (come i numeri di Python) e un oggetto mutevole (come le matrici di Numpy). Quando si esegue un'operazione su un oggetto immutabile, viene creata una nuova copia e la variabile viene aggiornata per fare riferimento alla nuova copia:

x = 0
...
x = 7

Prima viene creato un oggetto '0' e 'x' è impostato per fare riferimento ad esso. Quindi viene creato un '7' e 'x' viene aggiornato per riferirsi a questo. (Nota: questa è una semplificazione eccessiva, ma ai fini della risposta a questa domanda i dettagli non sono importanti)

Tuttavia quando crei una matrice numpy:

x = np.zeros(3)

questo memorizza un riferimento in x alla matrice creata e successivamente lo cambia:

x[i] = 1

questo non crea una nuova matrice, ma cambia quella esistente. Inoltre, se si utilizzano due variabili, come si fa:

x = y = np.zeros(3)

questo crea solo una singola matrice e fa riferimento sia a x che a y.

Permettere che un singolo oggetto sia memorizzato in più variabili è in realtà abbastanza utile in sistemi più grandi, dove ad esempio è possibile condividere una grande matrice (forse il peso di un livello di rete neurale) tra due sezioni separate di codice (ad es. fase di propagazione e il passo del formatore di propagazione all'indietro) e consentire a uno di essi (ad es. formazione in questo esempio) di cambiarlo e influenzare il comportamento dell'altro.

    
risposta data 14.07.2016 - 10:48
fonte

Leggi altre domande sui tag