【问题标题】:Size of data type using NumPy使用 NumPy 的数据类型的大小
【发布时间】:2017-12-07 07:50:09
【问题描述】:

在 NumPy 中,我可以通过以下方式获取特定数据类型的大小(以字节为单位):

datatype(...).itemsize

或:

datatype(...).nbytes

例如:

np.float32(5).itemsize #4
np.float32(5).nbytes   #4

我有两个问题。首先,有没有办法在不创建数据类型的实例的情况下获取这些信息?二、itemsizenbytes有什么区别?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您需要dtype 的实例来获取项目大小,但您不需要ndarray 的实例。 (稍后会清楚,nbytes 是数组的属性,而不是 dtype。)

    例如

    print np.dtype(float).itemsize
    print np.dtype(np.float32).itemsize
    print np.dtype('|S10').itemsize
    

    itemsizenbytes的区别而言,nbytes就是x.itemsize * x.size

    例如

    In [16]: print np.arange(100).itemsize
    8
    
    In [17]: print np.arange(100).nbytes
    800
    

    【讨论】:

    • 好答案。事实上,我此时并没有使用数组。在我的真实用例中,我有一个基于记录的数据文件格式——它有一个 240 字节的标头,然后是数据。数据的大小由元素的数量(从标题中读取)决定,但不存储数据类型:-(。最终,我希望用户能够传递dtype=... 并从中传递数据类型,我会得到每个数据元素的大小,所以我可以知道数据的大小。这样,我可以找到文件中的任何记录并直接读取它。看起来np.dtype是要走的路...谢谢。
    • FWIW,当 nbytes 仅在数组中特别有用时,它似乎是数据类型的一个实例......当然,我想我不知道numpy 数据模型足以评论太多......无论如何,谢谢。这正是我所需要的。
    • 我同意,numpy 的标量(例如np.float32(5))可能会令人困惑。 numpy 标量和 0-d numpy 数组(例如np.array(5, dtype=np.float32))之间的区别更加令人困惑。 (尝试索引 0-d 数组!) numpy 标量存在并具有与普通 ndarray 相同的属性的原因是,x[5].abs() 之类的东西对于 1d 数组将正常工作。这在“更广泛的图景”中是有道理的,但它会引起很多混乱。
    【解决方案2】:

    查看 NumPy C 源文件,这是注释:

    size : int
        Number of elements in the array.
    itemsize : int
        The memory use of each array element in bytes.
    nbytes : int
        The total number of bytes required to store the array data,
        i.e., ``itemsize * size``.
    

    所以在 NumPy 中:

    >>> x = np.zeros((3, 5, 2), dtype=np.float64)
    >>> x.itemsize
    8
    

    所以.nbytes 是一个快捷方式:

    >>> np.prod(x.shape)*x.itemsize
    240
    >>> x.nbytes
    240
    

    因此,要获得 NumPy 数组的基本大小而不创建它的实例,您可以这样做(例如,假设一个 3x5x2 的双精度数组):

    >>> np.float64(1).itemsize * np.prod([3,5,2])
    240
    

    但是,NumPy 帮助文件中的重要说明:

    |  nbytes
    |      Total bytes consumed by the elements of the array.
    |
    |      Notes
    |      -----
    |      Does not include memory consumed by non-element attributes of the
    |      array object.
    

    【讨论】:

    • 您通过np.float64(1) 创建了一个实例,这是我试图避免的。我想避免它的原因是因为在阅读该行时,用户可能会说“为什么是 1?” ...实际上, 1 并不特别...只是我需要一个 np.float64 的实例来获取 itemsize ...但是,+1 用于回答关于 itemsize 与 nbytes 的第二个问题(并阅读来源)...
    • 您也可以使用np.float64().itemsize。但是,如果您对替代方案进行计时,np.dtype(np.float64).itemsizenp.float64().itemsize 快一点没那么重要,但足够了。归结为我认为您认为更具可读性的内容。
    • 有趣...感谢您指出np.float64() 也可以。
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多