Pergunta

Eu sou novo para Python e Numpy, e eu estou enfrentando um problema, que eu não posso modificar um numpy.recarray, quando se aplica a vista mascarados. Eu li recarray de um arquivo, em seguida, criar duas visões mascarados, em seguida, tentar modificar os valores em loop. Aqui está um exemplo de código.

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

Mas quando eu imprimir o resultado

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

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

Todos os scale_means nos arquivos, ainda são zero.

Eu devo estar fazendo algo errado. Existe uma maneira correta de modificar valores da Visão? É porque eu estou aplicando dois pontos de vista, um por um?

Obrigado.

Foi útil?

Solução

Eu acho que você tem um equívoco nesse termo "mascarado vistas" e deve (re) ler A livro (agora livremente para download) para esclarecer sua compreensão.

Cito seção 3.4.2:

seleção Avançada é acionado quando o objecto de selecção, obj, é um não-tupla sequência de objecto, uma ndarray (De tipo de dados inteiro ou boleano), ou um tuplo com, pelo menos, uma sequência objeto ou ndarray (de tipo de dados número inteiro ou booleano). Existem dois tipos de indexação avançado: inteiro e Boleano. Seleção Avançada sempre devolve uma cópia dos dados (contraste com corte básica que retorna um view).

O que você está fazendo aqui é a seleção avançado (do tipo Boolean) para que você está recebendo uma cópia e nunca vinculativo lo em qualquer lugar - de fazer as alterações na cópia e, em seguida, apenas deixá-lo ir embora, em seguida, escrever um nova nova cópia do original.

Depois de entender o problema a solução deve ser simples: fazer sua cópia uma vez, faça as alterações nessa cópia e gravação que mesma cópia. Ou seja:.

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=' ')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top