1

我是 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 仍然为零。

我一定做错了什么。是否有修改视图值的正确方法?是因为我一个一个地应用两个视图吗?

谢谢你。

4

1 回答 1

3

我认为您对“蒙面视图”这个术语有误解,应该(重新)阅读本书(现在可免费下载)以澄清您的理解。

我引用第 3.4.2 节:

Advanced selection is triggered when the selection object, obj, is a non-tuple sequence object, an ndarray (of data type integer or bool), or a tuple with at least one sequence object or ndarray (of data type integer or bool). 高级索引有两种类型:整数和布尔。高级选择总是返回数据的副本(与返回视图的基本切片形成对比)。

你在这里做的是高级选择(布尔类型),所以你得到一个副本并且永远不会在任何地方绑定它 - 你在副本上进行更改然后让它消失,然后编写一个新的新副本从原文。

一旦你理解了问题,解决方案应该很简单:制作一次副本,在该副本上进行更改,然后编写相同的副本。IE:

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=' ')
于 2009-06-28T16:13:37.643 回答