我正在慢慢地进入一些机器学习领域,但在一项使用计算机视觉处理 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
那么我哪里错了? float 与 int 是一回事吗?
非常感谢解释
看一下 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 与 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''
Looking at the table below (https://docs.python.org/2/library/array.html), the type codes it's referencing are "int" and "float". x/=255.0 attempts to coerce an int (x) into a float (result of dividing x by 255.0). This is an unsafe cast, and you get your error message.
但 x=x/255.0 没问题,因为操作不是就地执行的。在右侧,我们得到 x/255.0 的结果,我们只需将该值分配给 x,就像您将任何浮点数分配给任何变量一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)