2014-05-23 2 views
2

I ont un problème affectant des valeurs à des variables dans le pythonaffectations de matrice python

import numpy 
a = numpy.empty((3,3,)) 
a[:] = numpy.NaN 
a 
b=a 
b[numpy.isnan(b)]=1 

jusqu'à l'avant-dernière ligne a et b sont égaux à matrices NaN:

>>> a 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
>>> b 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

mais lorsque le dernière instruction est exécutée (c.-à-b [numpy.isnan (b)] = 1) a et b deviennent des tableaux de ceux

>>> a 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> b 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 

comment puis-je mettre tableau b à o nes et array a à NaN. Notez que je dois maintenir le b = une déclaration

Répondre

2

Vous pouvez utiliser

b=numpy.copy(a) 

Puis b[numpy.isnan(b)]=1

In [45]: a[:] = numpy.NaN 

In [46]: b=numpy.copy(a) 

In [47]: b[numpy.isnan(b)]=1 

In [48]: a 
Out[48]: 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

In [49]: b 
Out[49]: 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 

L'utilisation b =a[:] ne fonctionnera pas dans votre exemple, les valeurs changent si vous modifiez soit tableau .

In [102]: import numpy 

In [103]: a = numpy.empty((3,3,)) 

In [104]: a[:] = numpy.NaN 

In [105]: a 
Out[105]: 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

In [106]: b=a[:] 

In [107]: b 
Out[107]: 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

In [108]: b[numpy.isnan(b)]=1 

In [109]: a 
Out[109]: 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 

In [110]: b 
Out[110]: 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
In [111]: a[:] = numpy.NaN 

In [112]: a 
Out[112]: 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

In [113]: b 
Out[113]: 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
1

Le problème que vous rencontrez est que les objets en python sont transmis par référence signifie que lorsque vous pensez que vous avez copié, il est vraiment juste une ombre de l'original et tous les changements sont reflétés.

Vous devez utiliser numpy.copy() La façon pythonique de cloner un tableau est en découpant:

b = a[:] 

Mais cela ne fonctionne pas pour numpy.ndarray s parce qu'ils ont un comportement différent. Slicing ne crée pas une copie donc vous devez utiliser:

b = numpy.copy(a) 

Voir:

Bug or feature: cloning a numpy array w/ slicing

Preuve:

>>> def setOnes(nparr): 
...  nparr[:] = 1 
... 
>>> a = numpy.empty((3,3,)) 
>>> a[:] = numpy.NaN 
>>> b = a[:] 
>>> a 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
>>> setOnes(a) 
>>> a 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> b 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> a[:] = numpy.NaN 
>>> a 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
>>> b = numpy.copy(a) 
>>> b 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
>>> setOnes(b) 
>>> b 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> a 
array([[ nan, nan, nan], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 
+0

Avez-vous essayé? –

+0

@PadraicCunningham oui ça ne marche pas:/Edité donc ça a du sens. – nettux443

+0

Oui, je sais que ce n'est pas;) –

0

regard dans le module de copie. Je pense que deepcopy est ce que tu veux. Alternativement, au lieu de b = a, vous pouvez écrire b = a [:]

+0

b = a [:] fonctionne pour les listes, mais pas pour les tableaux Dumpy – nettux443

0

b = a copie la référence a en b et non a contenu de l'objet référencé.

Essayez avec:

b = numpy.array(a)