如何使用其两个视图修改NumPy.recarray

时间:2009-06-28 15:47:55

标签: python numpy matplotlib

我是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 个答案:

答案 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=' ')