为什么Python中使用numpy进行float32/int除法会得到float64的结果?

4

我有一个numpy.float32矩阵V,然后我用一个整数标量值进行了除法操作:

V = V/num

其中num是一个整数。结果有些令人惊讶,V被转换为numpy.float64矩阵。

有没有人能帮助理解为什么会这样呢?

谢谢!


1
可能是因为在numpy中,将int转换为float32被认为是不安全的(尝试使用'np.can_cast(int, np.float32)`)。 - Paul Panzer
1
如果我使用“int”,我仍然得到一个“np.float32”数组。你能提供一个 [mcve] 吗? - juanpa.arrivillaga
1
@PaulPanzer 这取决于所涉及的 int,例如 np.can_cast(2**15, np.float32) 对我来说返回 True,但是 np.can_cast(2**16, np.float32) 返回 False - juanpa.arrivillaga
@Paul Panzer np.can_cast(int, np.float32) 返回 False。我的理解是 Python 默认使用 int32,那么将 int32 转换为 numpy.float32 为什么会出现问题?numpy.float32 的范围足够大,可以处理从 int32 的转换。 - YC0
1
请参见 https://dev59.com/XqTja4cB1Zd3GeqPGr9K。 - user2357112
显示剩余8条评论
1个回答

2
根据Numpy.result_type,numpy.float32无法完整地保留int32。当操作涉及到int32时,numpy会将结果提升为float64。同时,根据@Eric的说法,在不同的环境下实际的int类型可能会发生变化,因此进行预测试是避免一些潜在意外的好方法。
建议阅读一个类似的之前问题:Numpy casting float32 to 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来展示。
感谢您在问题下面提供的有见地的评论。这个回答是对这些评论的简短总结。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接