据我了解,在 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 执行。它是如何工作的?
最佳答案
在第 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
正如你所期望的那样。
关于python - Numpy float 促销不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66538595/