【问题标题】:Specifying default dtype for np.array(1.)为 np.array(1.) 指定默认 dtype
【发布时间】:2016-12-17 07:42:01
【问题描述】:

有没有办法指定与 np.array(1.) 等构造一起使用的默认 dtype?

我特别希望np.array(1.) 成为np.float32np.array(1) 成为np.int32。相反,我得到np.float64np.int64

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    默认值取决于您的系统。在 64 位系统上,默认类型为 64 位。在 32 位系统上,默认类型为 32 位。没有办法改变使用不同系统 C 头重新编译 numpy 的默认值。

    您当然可以明确指定 dtypes,例如

    >>> x = np.array(1, dtype='int32')
    

    编辑:正如 kazemakase 下面提到的,以上仅适用于 int32/int64。在最近的 numpy 版本中,无论系统如何,浮点的默认值都是 float64。

    【讨论】:

    • 好的,看起来 numpy 还没有为 GPU 时代做好准备。现在的系统是 64 位的,但 GPU 计算主要是在 32 位中完成的,所以我们最终会发现人们通过将默认的 numpy 类型传播到 GPU 来做次优的事情
    【解决方案2】:

    您可以使用np.float32np.int32 作为np.ndarray 构造函数:

    >>> np.float32([1.])
    array([ 1.], dtype=float32)
    >>> np.int32([1])
    array([1], dtype=int32)
    

    但如果给定标量输入(不是 0 级数组),则返回一个 numpy 标量:

    >>> np.float32(1)
    1.
    >>> np.asarray(np.float32(1))  # Use np.asarray to convert it to an array
    array(1.0, dtype=float32)
    

    重新定义默认 dtype 似乎不是那么容易,另请参阅:

    如果您不关心额外的开销,您可以随时使用字典作为“开关”来为您认为不合适的人获取正确的 dtype:

    defaults = {np.dtype('int64'): np.int32,
                np.dtype('float64'): np.float32}
    
    before = 1.
    np.array(before, dtype=defaults.get(np.result_type(before), None))
    

    但是,对于复杂的类型,例如字符(字符串)或对象,这将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多