首页 > 解决方案 > Numpy浮动促销不一致

问题描述

我的理解是,在 中x = f() * g(),首先f()执行,然后g(),然后将结果相乘,然后才分配给x. 然而下面似乎与此相矛盾:

import numpy as np

print(np.sqrt(2).dtype)
print((np.array([1.], dtype='float32') * np.array([.5], dtype='float64')).dtype)
print((np.array([1.], dtype='float32') * np.sqrt(2)).dtype)
>>> float64
>>> float64
>>> float32

在我之前的所有经验中,Numpy 都晋升到了更大的级别dtype,但不是在这里。如果我们分配单个数组并随后相乘,则行为相同。我想 Numpy 使用了一些隐藏属性,dtype而不是推翻 Python 执行。

效果如何?

标签: pythonarraysnumpycasting

解决方案


在第 2 行:

print((np.array([1.], dtype='float32') * np.array([.5], dtype='float64')).dtype)

您正在将两个数组相乘,因此它会提升 dtype(如您所料)。但是,在第三行:

print((np.array([1.], dtype='float32') * np.sqrt(2)).dtype)

您将一个标量乘以一个数组,它会保留数组 dtype。请注意,如果您将标量替换为这样的数组:

print((np.array([1.], dtype='float32') * np.sqrt([2])).dtype)

你会再次得到float64你所期望的。


推荐阅读