Question

Je connais Python et Numpy pour la première fois et je suis confronté à un problème que je ne peux pas modifier numpy.recarray lorsqu’il s’applique à des vues masquées. J'ai lu recarray à partir d'un fichier, puis j'ai créé deux vues masquées, puis essayé de modifier les valeurs dans la boucle. Voici un exemple de code.

import numpy as np
import matplotlib.mlab as mlab


dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01


for d in dat[m_Obsr][m_ZeroScale]:
    d.scale_mean = 1.0

Mais quand j'imprime le résultat

newFile = args[0] + ".no-zero-scale"

mlab.rec2csv(dat[m_Obsr][m_ZeroScale], newFile, delimiter=' ')

Tous les scale_means dans les fichiers sont toujours à zéro.

Je dois faire quelque chose de mal. Existe-t-il un moyen approprié de modifier les valeurs de vue? Est-ce parce que j'applique deux vues l'une après l'autre?

Merci.

Était-ce utile?

La solution

Je pense que vous avez une idée fausse concernant ce terme & "; vues masquées &"; et devrait (re) lire le Le livre (à télécharger gratuitement) pour clarifier votre compréhension.

Je cite la section 3.4.2:

  

La sélection avancée est déclenchée lorsque   l'objet selection, obj, est un   objet séquence non-tuple, un ndarray   (de type de données entier ou bool), ou un   tuple avec au moins une séquence   objet ou ndarray (de type de données   entier ou bool). Il y a deux types   d'indexation avancée: entier et   Booléen Sélection avancée toujours   renvoie une copie des données (contraste   avec tranchage de base qui retourne un   voir).

Ce que vous faites ici est une sélection avancée (du type booléen), de sorte que vous obtenez une copie et que vous ne la liez jamais nulle part. Vous apportez vos modifications à la copie, puis vous la laissez disparaître, puis écrivez une copie. nouvelle copie fraîche de l'original.

Une fois que vous avez compris le problème, la solution devrait être simple: effectuez votre copie une fois, apportez vos modifications sur cette copie et écrivez cette même copie. I.e.:

dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01
the_copy = dat[m_Obsr][m_ZeroScale]

for d in the_copy:
    d.scale_mean = 1.0

newFile = args[0] + ".no-zero-scale"
mlab.rec2csv(the_copy, newFile, delimiter=' ')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top