使用 /= 规范化变量会抛出 ufunc 错误

Normalizing variable using /= throws ufunc error

我正在慢慢学习一些机器学习,但在一次使用计算机视觉对 kaggle 猫狗数据集进行练习时,发生了一些我不太明白的事情。

然后当我尝试将 pickle 中的图像值归一化时,它在写入时起作用了

X = X/255.0

但是在我写的时候抛出一个错误

 X /=255.0

TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'B') according to the casting rule ''same_kind''

据我了解 x /= 255.0 应该与 X = X/255.0 相同所以我哪里错了?浮点数还是整数?

非常感谢解释

查看 python 文档中的增强分配:https://docs.python.org/3/reference/simple_stmts.html#index-14

...

扩充赋值计算目标(与普通赋值语句不同,它不能是拆包)和表达式列表,对两个操作数执行特定于赋值类型的二元运算,并将结果赋给原来的目标。目标仅被评估一次。

像 x += 1 这样的扩充赋值表达式可以重写为 x = x + 1 以实现类似但不完全相等的效果。在增强版本中,x 仅被评估一次。此外,如果可能,实际操作就地执行,这意味着不是创建新对象并将其分配给目标,而是修改旧对象。

与普通赋值不同,扩充赋值先评估左侧,然后再评估右侧。例如,a[i] += f(x) 首先查找 a[i],然后计算 f(x) 并执行加法,最后将结果写回 a[i]。

...

所以你是部分正确的,这是一个 float vs int 的问题,结合操作是否就地执行。

x/=255.0 不起作用,因为该操作是就地执行的。让我们看看您的错误消息: TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'B') according to the casting rule ''same_kind''

查看下面的 table (https://docs.python.org/2/library/array.html),它引用的类型代码是 "int" 和 "float"。 x/=255.0 尝试将 int (x) 强制转换为 float(x 除以 255.0 的结果)。这是一个不安全的转换,您会收到错误消息。

但是 x=x/255.0 没问题,因为操作不是就地执行的。在右侧,我们得到 x/255.0 的结果,我们只需将此值分配给 x,就像您将任何浮点数分配给任何变量一样。