将np.float64对象除以2会使返回值的dtype为np.float32吗?

时间:2019-11-21 10:45:58

标签: python numpy tensorflow

当我阅读一些Tensorflow源代码时,我发现了这一点:

  if tf_dtype.is_floating:
    if spec.dtype == np.float64 and np.any(np.isinf(high - low)):
      # The min-max interval cannot be represented by the np.float64. This is a
      # problem only for np.float64, np.float32 works as expected.
      # Spec bounds are set to read only so we can't use argumented assignment.
      low = low / 2  # pylint: disable=g-no-augmented-assignment
      high = high / 2  # pylint: disable=g-no-augmented-assignment
    return rng.uniform(
        low,
        high,
        size=spec.shape,
    ).astype(spec.dtype)

我对python不太熟悉。上面的代码看起来非常有趣,这意味着在操作时

 low = low / 2  
 high = high / 2  

将使新的lowhigh的dtype成为float32。但是当我在python终端中尝试这个

>>> a = np.array([2.0], dtype=np.float64)
>>> a.dtype
dtype('float64')
>>> b = a/2
>>> b.dtype
dtype('float64')

事情看起来不像这样。代码源是here,在第42行。有人可以解释吗?谢谢。

2 个答案:

答案 0 :(得分:0)

不。

这似乎是解决np.float64数组中最小值和最大值之间的间隔问题的解决方法。张量流代码不会返回np.float32,而是会计算正确的值并使用原始类型返回它。

此外,从您的代码段来看,您在终端上运行的代码使用的是纯numpy,并且在tensorflow库附近没有任何地方,因此不会从tensorflow中重现任何奇怪的行为。

答案 1 :(得分:0)

不。要重新缩放为其他数据类型,可以使用 normalization

zero_to_one = np.divide(old_val/np.amax(old_val)) # normalizes to 0 - 1
new_range = zero_to_one * max_val_of_new_dtype
new_range = np.array(new_range, dtype='desired dtype')