Как изменить NumPy.recarray, используя два его представления - PullRequest
1 голос
/ 28 июня 2009

Я новичок в 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 в файлах по-прежнему равны нулю.

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

Спасибо.

1 Ответ

3 голосов
/ 28 июня 2009

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

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

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

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

Как только вы поймете проблему, решение должно быть простым: сделайте свою копию один раз, внесите изменения в эту копию и напишите ту же самую копию. 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=' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...