Почему размер массива NumPy отличается? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть два numpy a,b их форма (100,2048), и я использовал sys.getsizeof(a) = 112 и то же самое с массивом b.

У меня есть вопрос, когда я использую c = np.concatenate((a,b),axis=0), форма c (200,2048), но sys.getsizeof(c) = 1638512

Почему?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

getsizeof имеет ограниченное значение. Это может быть далеко для списков. Для массивов это лучше, но вы должны понимать, как хранятся массивы.

In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896

Но посмотрите на size из view:

In [450]: b = a.reshape(10,10)
In [451]: sys.getsizeof(b)
Out[451]: 112

Показывает размер объекта массива, но не размер общего буфера данных. b не имеет собственного буфера данных.

In [453]: a.size
Out[453]: 100
In [454]: b.size
Out[454]: 100

Так что я предполагаю, что ваши a и b являются представлениями некоторых других массивов. Но конкатенация создает новый массив со своим собственным буфером данных. Это не может быть вид на другие два. Так что это getsizeof отражает это.

In [457]: c = np.concatenate((a,b.ravel()))
In [459]: c.shape
Out[459]: (200,)
In [460]: c.size
Out[460]: 200
In [461]: sys.getsizeof(c)
Out[461]: 1696

Буфер данных для a составляет 100 * 8 байт, поэтому «издержки» равны 96. Для c, 200 * 8, опять же, с 96 «служебными данными».

0 голосов
/ 01 сентября 2018

Это не воспроизводит ваш пример:

import numpy as np
import sys

a = np.random.rand(100, 2048)
b = np.random.rand(100, 2048)

print(sys.getsizeof(a), sys.getsizeof(b))
# 1638512 1638512

c = np.concatenate((a,b), axis=0)
print(sys.getsizeof(c))
# 3276912   which is about 1638512 + 1638512
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...