質問

私はPythonとnumpyのに新しいです、と私は意見をマスクしするために適用するとき、私は、numpy.recarrayを変更できないという、問題に直面しています。私は、forループ内の値を変更しようと、2つのマスクされたビューを作成し、ファイルから読み込む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は、まだゼロでます。

私が何か間違ったことしなければなりません。の値を変更する適切な方法はあります 見る?私は2つのビューを一つずつ適用していますので、それは何ですか?

ありがとうございます。

役に立ちましたか?

解決

私はあなたがこの用語「マスクされたビュー」で誤解を持っているし、(再)読むべきだと思いますご理解を明確にするブックに(今自由にダウンロード)。

私は、セクション3.4.2から引用します

  

高度な選択がトリガされたときに   選択オブジェクトは、OBJ、あります   非タプル配列オブジェクト、ndarray   (データ型、整数またはブールの)、又はA   少なくとも一つの配列を持つタプル   データタイプのオブジェクトまたはndarray(   整数またはブール値)。 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=' ')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top