我新的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   或(数据类型整数或布尔的)   与至少一个元组序列   对象或ndarray(的数据类型   整数或布尔)。有两种类型的   先进的索引:整数和   布尔。先进的选择总是   返回数据的副本(对比度   基本切片返回一个   视图)。

你在做什么这里是高级选择(布尔那种),这样你得到一个副本,从来没有在任何地方结合 - 你在复印件的更改,然后就让它走,然后写一个新鲜复制从原始

一旦你理解这个问题的解决方案应该是简单的:让你的副本一次,就该副本的更改,并编写相同的副本。即:

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