2015-08-13 18 views
19

sto usando Python 2.7.3, quando eseguo il seguente pezzo di codice:serie NumPy, differenza tra una/= x vs. a = a/x

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a = a/float(2**16 - 1) 
print a 

Questo si tradurrà in lui dopo uscita:

>> array([[1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
>>  [6.10360876e-05, 7.62951095e-05, 9.15541314e-05]]) 

Esattamente come previsto, ma quando eseguo il seguente pezzo di codice:

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a /= float(2**16 - 1) 
print a 

ottengo il seguente output:

>> array([[0, 0, 0], 
>>  [0, 0, 0]]) 

mi aspettavo la stessa uscita come nell'esempio precedente, non capisco la diversa ouput, che sembra essere il risultato di utilizzando a /= float(2**16 - 1) vs a = a/float(2**16 - 1).

+1

[sto riapertura questo . È correlato al duplicato proposto originale, ma nessuna delle risposte a questa domanda risolve il problema relativo al dtype. Probabilmente c'è un altro duplicato da qualche parte, ma non è quello.] – DSM

+0

@DSM D'accordo, la domanda collegata non spiegava davvero cosa sta succedendo qui. Spiega perché * può * essere un risultato diverso, ma non * perché * accade in questo caso. – poke

+0

Domanda correlata: [Comportamento imprevisto per numpy self division] (http://stackoverflow.com/q/15907484/832621) –

risposta

29

From the documentation:

Attenzione:

Nelle operazioni Consiglio eseguirà il calcolo utilizzando la precisione deciso dal tipo di dati dei due operandi, ma silenziosamente downcast il risultato (se necessario) così può rientrare nell'array. Pertanto, per calcoli a precisione mista, A {op}= B può essere diverso da A = A {op} B. Ad esempio, supponiamo a = ones((3,3)). Quindi, a += 3j è diverso da a = a + 3j: mentre entrambi eseguono lo stesso calcolo, a += 3 sostituisce il risultato per rientrare in a, mentre a = a + 3j re-associa il nome a al risultato.

Poiché la matrice era un array di numeri interi, quando si utilizzano le operazioni sul posto, il risultato verrà nuovamente downcast su numeri interi.

Se si modifica la matrice in modo che memorizza galleggianti in origine, poi i risultati (che sono galleggianti) possono essere immagazzinate nella matrice originale, e il codice funzionerà bene:

>>> a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 
>>> a /= float(2**16 - 1) 
>>> a 
array([[ 1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
     [ 6.10360876e-05, 7.62951095e-05, 9.15541314e-05]])