2009-06-28 32 views
1

我是新來的Python和Numpy,我面臨一個問題,我不能修改numpy.recarray,當應用到蒙面的意見。我從文件中讀取數據庫,然後創建兩個屏蔽的視圖,然後嘗試修改for循環中的值。這是一個示例代碼。如何修改一個NumPy.recarray使用其兩個視圖

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

我認爲你在這個術語中有一個誤解,認爲你應該(重新)閱讀The Book(現在可以免費下載)來澄清你的理解。

我從節3.4.2引述如下:

高級選擇被觸發時 選擇對象obj是 非元組序列對象,ndarray (的數據類型整數或布爾) ,或者具有至少一個序列 對象或ndarray(數據類型爲 integer或bool)的元組。有兩種類型 高級索引:整數和 布爾值。高級選擇總是 返回數據的副本(對比 與基本切片,返回 視圖)。

你在這裏做的是高級選擇(布爾類型),所以你得到一個副本,永遠不會綁定到任何地方 - 你對副本進行修改然後讓它消失,然後從原件中寫出新的副本。

一旦你理解了這個問題,解決方案應該是簡單的:複製一次,在你的副本上做出改變,然後寫出同樣的副本。 I .: .:

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=' ') 
+0

是的,你是對的我沒有意識到我正在做一個高級選擇,而後者返回一個臨時副本。而我對「蒙面觀點」的理解確實很模糊。 謝謝你的報價。我之前正在閱讀同一部分3,但沒有看到這個§。您的修復程序將起作用 雖然我的問題是否可以修改dat中的原始數據,而不需要複製數組的一部分。我需要保留原始的順序,而只修改子集。 簡單的迭代方法會起作用嗎?還是有更好的? – 2009-06-28 16:41:29

相關問題