その2つのビューを使用してNumPy.recarrayを変更する方法
-
20-08-2019 - |
質問
私は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=' ')