使用NumPy的数据类型的大小

mgi*_*son 40 python numpy

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

datatype(...).itemsize
Run Code Online (Sandbox Code Playgroud)

要么:

datatype(...).nbytes
Run Code Online (Sandbox Code Playgroud)

例如:

np.float32(5).itemsize #4
np.float32(5).nbytes   #4
Run Code Online (Sandbox Code Playgroud)

我有两个问题.首先,有没有办法在不创建数据类型实例的情况下获取此信息?第二,itemsize和之间的区别是nbytes什么?

Joe*_*ton 52

你需要一个实例dtype来获取itemsize,但你不需要一个实例ndarray.(如果在一秒钟内变得清晰,nbytes则是数组的属性,而不是dtype.)

例如

print np.dtype(float).itemsize
print np.dtype(np.float32).itemsize
print np.dtype('|S10').itemsize
Run Code Online (Sandbox Code Playgroud)

至于之间的区别itemsizenbytes,nbytes只是x.itemsize * x.size.

例如

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

In [17]: print np.arange(100).nbytes
800
Run Code Online (Sandbox Code Playgroud)


daw*_*awg 17

查看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``.
Run Code Online (Sandbox Code Playgroud)

所以在NumPy中:

>>> x = np.zeros((3, 5, 2), dtype=np.float64)
>>> x.itemsize
8
Run Code Online (Sandbox Code Playgroud)

因此.nbytes是一个快捷方式:

>>> np.prod(x.shape)*x.itemsize
240
>>> x.nbytes
240
Run Code Online (Sandbox Code Playgroud)

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

>>> np.float64(1).itemsize * np.prod([3,5,2])
240
Run Code Online (Sandbox Code Playgroud)

但是,来自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.
Run Code Online (Sandbox Code Playgroud)

  • 您也可以执行“np.float64().itemsize”。但是,如果您对替代方案进行计时,则 `np.dtype(np.float64).itemsize` 比 `np.float64().itemsize` 快一点,这并不重要,但足够了。我想这归结为你认为更具可读性。 (2认同)