フィールドにfloats
が含まれている場合、構造化配列の異なるフィールドに含まれるすべてのデータを正規化しようとしています。しかし、私は各フィールドを1つ1つループしていますが、私は警告を受けています。構造化配列の単一フィールドに警告を出さずに書き込む方法
for idt, dt in enumerate(data.dtype.names):
if "float32" in data.dtype[idt].name:
stds = np.std(data[dt])
means = np.mean(data[dt])
data[dt] = (data[dt] - means)/stds
最後の行を実行した後、これはポップアップ表示:
FutureWarning:配列へのnumpyのは、あなたが(かもしれない)ことを検出した書き込みがnumpy.diagonalするかで複数のフィールドを選択することにより、 を返さ構造体 配列。このコードは、将来numpyのリリースで破損する可能性があります。 詳細については、numpy.diagonalまたはarrays.indexingリファレンスドキュメントを参照してください。 クイックフィックスは明示的なコピーを作成することです(例えば、 arr.diagonal()。copy()またはarr [['f0'、 'f1']]。copy())。データ[DT] =(データ[DT] - 手段)/性感染症
私は確信してすべてが期待されるようにするためにデバッガで行ごとにそれを実行することができ、例えば:
In[]: data.dtype
Out[]: dtype([('a', '<f4'), ('b', '<f4'), ('c', '<f4'), ('d', '<i4')])
In[]: dt
Out[]: 'a'
In[]: data[dt].shape
Out[]: (2000, 8)
後警告メッセージ内の提案は、配列をコピーします:
data2 = data.copy()
for idt, dt in enumerate(data2.dtype.names):
if "float32" in data2.dtype[idt].name:
stds = np.std(data2[dt])
means = np.mean(data2[dt])
data2[dt] = (data2[dt] - means)/stds
data = data2
警告を取り除くためにもっとエレガントな方法はありますか?この場合、コピーはどのように変更されましたか?
「データ」はどのように作成されましたか? – hpaulj
@hpaulj 'data'は' h5py'ライブラリを使ってhdf5ファイルから読み込まれます。オリジナルの作成プロセス私は多くを知らない。しかし、もしあなたが何をしているか教えてくれれば、私はそれについていくつか余分なテストをすることができます。 – Nyps
警告と修正は、 'data'が他の構造化された配列からの多面体選択であることを示唆しています。 'data = bigger_data [['a'、 'b'、 'c'、 'd']]'。問題は、 'data'が' bigger_data'のビューかコピーか、あなたの編集(一度に一つのフィールド)が 'bigger_data'に影響するかどうかです。 – hpaulj