Подтвердить что ты не робот

Размер данных с использованием NumPy

В NumPy я могу получить размер (в байтах) определенного типа данных:

datatype(...).itemsize

или

datatype(...).nbytes

Например:

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

У меня есть два вопроса. Во-первых, есть ли способ получить эту информацию, не создавая экземпляр типа данных? Во-вторых, какая разница между itemsize и nbytes?

4b9b3361

Ответ 1

Вам нужен экземпляр dtype для получения элементов, но вам не нужен экземпляр ndarray. (Как станет ясно в секунду, nbytes является свойством массива, а не dtype.)

например.

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

Что касается разницы между itemsize и nbytes, nbytes является просто x.itemsize * x.size.

например.

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

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

Ответ 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.