1

私は Python と Numpy が初めてで、マスクされたビューに適用するときに numpy.recarray を変更できないという問題に直面しています。ファイルから recarray を読み取り、マスクされたビューを 2 つ作成してから、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 は、まだゼロです。

私は何か間違ったことをしているに違いない。ビューの値を変更する適切な方法はありますか? 2 つのビューを 1 つずつ適用しているからでしょうか。

ありがとうございました。

4

1 に答える 1

3

あなたはこの「マスクされたビュー」という用語に誤解を持っていると思います。理解を明確にするために、 The Book (現在は無料でダウンロード可能) を (再) 読む必要があります。

セクション 3.4.2 から引用します。

高度な選択は、選択オブジェクト obj が非タプル シーケンス オブジェクト、ndarray (integer または bool データ型)、または少なくとも 1 つのシーケンス オブジェクトまたは ndarray (データ型 integer または bool) を持つタプルである場合にトリガーされます。高度なインデックス作成には、整数とブールの 2 種類があります。高度な選択では、常にデータのコピーが返されます (ビューを返す基本的なスライスとは対照的です)。

ここで行っているのは (ブール型の) 高度な選択であるため、コピーを取得し、それをどこにもバインドすることはありません。コピーに変更を加えてから、それを手放し、新しい新鮮なコピーを書き込みます。オリジナルから。

問題を理解したら、解決策は簡単です。一度コピーを作成し、そのコピーに変更を加えて、同じコピーを作成します。すなわち:

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=' ')
于 2009-06-28T16:13:37.643 に答える