如果字段包含floats
. 但是,即使我一个接一个地遍历每个字段,我也会收到警告。
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
我可以在调试器中逐行运行它,以确保一切都符合预期,例如:
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
摆脱警告的更优雅的方法是什么?在这种情况下,副本发生了什么变化?