【问题标题】:numpy.array with and without specifying dtype behaves strangenumpy.array 有和没有指定 dtype 的行为很奇怪
【发布时间】:2017-08-16 04:11:56
【问题描述】:

我对此完全感到困惑。

来自以下

import numpy as np

a = np.array([4, -9])
a[0] = 0.4
a

预期输出:array([ 0.4, -9])。但它给了我

array([ 0, -9]).

但是当我把dtype改成f

a = np.array([4, -9], 'f')
a[0] = 0.4
a

它给了我array([ 0.40000001, -9. ], dtype=float32) 的预期输出

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0) 的文档说:

dtype : 数据类型,可选 数组所需的数据类型。如果没有给出,那么类型将被确定为在序列中保存对象所需的最小类型。此参数只能用于“向上转换”数组。对于向下转换,请使用 .astype(t) 方法。

当我初始化数组时,它会将值初始化为integers,因此当我用float 索引数组时,它只识别0.4integer 部分,因此给了我0。我是这样理解的。这个对吗?。但我仍然对这种行为感到惊讶。

问题:这里到底发生了什么?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    问题是你的数组是dtype=np.int64:

    In [141]: a = np.array([4, -9])
    
    In [142]: a.dtype
    Out[142]: dtype('int64')
    

    这意味着您只能存储整数,并且在分配完成之前会截断任何浮点数。如果要将浮点数和整数存储在一起,则应先指定dtype=object

    In [143]: a = np.array([4, -9], dtype=object)
    
    In [144]: a[0] = 0.4
    
    In [145]: a
    Out[145]: array([0.4, -9], dtype=object) 
    

    至于array([ 0.40000001, -9. ]0.4 的问题,因为浮点数在内存中没有精确的表示(只有一个近似值),这导致了您看到的不精确。

    【讨论】:

    • 优秀。这解决了问题。显然,我还有很多东西要学。
    • 我不喜欢使用dtype=object 来保存浮点数和整数的想法。如果需要,可以混合字符串和数字,或者更好地保存列表等内容。但对于纯数字数据,最好使用数字 dtype。
    • @hpaulj 已接受。使用非数字类型,您将失去所有矢量化优势。
    • 什么是数字 dtype 可以完成这项工作? float? d??
    • @JackDawkins 我认为最重要的问题是您想将整数和浮点数存储在一起。如果你想这样做,这就是方法。但我们给你的建议是:不要这样做。
    猜你喜欢
    • 2011-10-23
    • 2015-05-29
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多