2

フィールドに が含まれている場合、構造化配列のさまざまなフィールドに含まれるすべてのデータを正規化しようとしていますfloats。ただし、各フィールドを 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() を実行します)。data[dt] = (data[dt] - 手段) / stds

デバッガーで 1 行ずつ実行して、すべてが期待どおりであることを確認できます。

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

警告を取り除くためのよりエレガントな方法は何でしょうか? そして、この場合、コピーは何を変更しましたか?

4

1 に答える 1