Como modificar um NumPy.recarray usando suas duas visões
-
20-08-2019 - |
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.
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=' ')