Как изменить NumPy.recarray, используя его два представления

StackOverflow https://stackoverflow.com/questions/1055131

  •  20-08-2019
  •  | 
  •  

Вопрос

Я новичок в Python и Numpy, и я столкнулся с проблемой, заключающейся в том, что я не могу изменить numpy.recarray при применении к замаскированным представлениям.Я считываю recarray из файла, затем создаю два замаскированных представления, затем пытаюсь изменить значения в цикле for .Вот пример кода.

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

Но когда я печатаю результат

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

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

Все scale_means в файлах по-прежнему равны нулю.

Должно быть, я делаю что-то не так.Есть ли правильный способ изменения значений в представлении ?Это потому, что я применяю два представления одно за другим?

Спасибо.

Это было полезно?

Решение

Я думаю, у вас неправильное представление об этом термине "замаскированные представления" и вам следует (перечитать) его Книга (теперь можно скачать бесплатно), чтобы прояснить ваше понимание.

Я цитирую из раздела 3.4.2:

Расширенный выбор запускается, когда объект выбора, obj, является объектом последовательности, не состоящей из кортежей, ndarray (типа данных integer или bool), или кортежем, содержащим хотя бы одну последовательность объект или ndarray (типа данных целое число или bool).Существует два типа расширенной индексации:целое число и Логическое значение.Расширенный выбор всегда возвращает копию данных (в отличие от базового среза, который возвращает вид).

То, что вы здесь делаете, - это расширенный выбор (логического типа), так что вы получаете копию и нигде ее не привязываете - вы вносите свои изменения в копию, а затем просто удаляете ее, затем записываете новую копию с оригинала.

Как только вы поймете проблему, решение должно быть простым:сделайте свою копию один раз, внесите свои изменения в эту копию и напишите ту же самую копию.То есть.:

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=' ')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top