我是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仍为零。
我一定是做错了。有没有一种正确的修改价值的方法 视图?是因为我一个接一个地应用两个观点吗?
谢谢。
答案 0 :(得分:3)
我认为你对这个术语“蒙面观点”有误解,应该(重新)阅读The Book(现在可免费下载)以澄清你的理解。
我引用第3.4.2节:
高级选择时会触发 选择对象obj是一个 非元组序列对象,ndarray (数据类型为integer或bool)或a 具有至少一个序列的元组 object或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=' ')