Why does Python numpy float32 / int division gives a float64 result?
我有一个numpy.float32矩阵V,然后用整数标量值进行了除法:
其中num是整数。 将V转换为numpy.float64矩阵,结果有些令人惊讶。
谁能帮助理解为什么会这样吗?
谢谢!
-
什么是num?
-
这可能是因为numpy将int转换为float32被认为是不安全的(尝试np.can_cast(int,np.float32`))
-
如果使用int,我仍然会得到一个np.float32数组。您能否提供一个最小的可复制示例?
-
@PaulPanzer它取决于有问题的int,例如np.can_cast(2**15, np.float32)为我返回True,但是np.can_cast(2**16, np.float32)返回False
-
@Paul Panzer np.can_cast(int,np.float32)确实给出了False。我的理解是python默认使用int32,那么为什么将int32转换为numpy.float32是有问题的操作? numpy.float32的范围足以处理从int32进行的转换。
-
参见stackoverflow.com/questions/45949263/
-
@ juanpa.arrivillaga,YC0,user2357112非常感谢您澄清这一点。
-
@ juanpa.arrivillaga Vtest = np.zeros([1,1]).astype(float32) Vest_new = Vtest65536 type(Vest_new[0,0]))
-
如果num小于或等于65535(int16),则不会更改float32。问题似乎来自int32。
-
请注意,链接的Q / A具有非常有用的链接
-
值得注意的是numpy使用int来引用C long,有时是int32有时是int64,这取决于您的平台-这就是@ juanpa.arrivillaga无法重现此原因的原因
-
@ YC0" python"没有大小整数。 Python int对象任意大。这就是为什么python乐于评估2**128的原因
-
@ user2357112,Eric,juanpa.arrivillaga,Paul Panzer,非常感谢!我想我现在有一个更好的主意。这是合理的,因为numpy确定float32不能无损地保存int32的所有值。因此,这就是为什么当我将65535增加到65536时,会将重新组合类型更改为float64。
根据Numpy.result_type,numpy.float32不能无损地保存int32。 当对int32进行操作时,numpy会将结果值提升为float64。 同样根据@Eric,实际的int类型可能会在不同的环境中发生变化,因此进行预测试是避免某些潜在意外的好习惯。
建议使用类似的先前问题进行进一步阅读:将Numpy转换为float32到float64
。 Numpy对于纯标量运算和涉及数组的运算有不同的处理方式。 在这种情况下,除法运算涉及一个ndarray,因此,当num小于65536但大于255时,numpy将其转换为int16。 Numpy确定int16可以无损地转换为float32,而int32则可以无损。 np.can_cast(np.int16, np.float32)给出True,而np.can_cast(np.int32, np.float32)给出False。
感谢您对问题的深刻见解。 该答案是这些评论的简短摘要。