如何使用它的两个意见,修改NumPy.recarray
-
20-08-2019 - |
题
我新的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=' ')
不隶属于 StackOverflow