неправильный размер python с getsizeof () и .nbytes с вложенными списками - PullRequest
0 голосов
/ 25 ноября 2018

Я прошу прощения, если это дублирующая проблема, но у меня были некоторые проблемы с .nsize и sys.getsizeof().

В частности, у меня есть список , который содержит numy массивы , каждый массив является трехмерным представлением изображения (строка, столбец, RGB), и каждое из этих изображений имеет разные размеры.Имеется более 4000 изображений, и это может увеличиться в будущем, поскольку я планирую использовать их для машинного обучения.

Когда я использую .nsize с одним изображением, я получаю правильный размер, но когда я пытаюсьоценивая всю партию, я получаю неправильный размер:

# size of image 1 in bytes
print("size of first image: %d bytes" % images[0].nbytes)

# size of all images in bytes
print("total size of all images: %d bytes" % images.nbytes)

Результат:

size of first image: 60066 bytes

total size of all images: 36600 bytes

Единственные способы обойти это - либо пройти по всем изображениям, либо перейти на чудовищный 4Dмассив вместо списка трехмерных массивов?Есть ли другая функция, которая лучше оценивает размер для этого типа вложенных настроек?

Я использую Python 3.6.7.

1 Ответ

0 голосов
/ 25 ноября 2018

Попробуйте запустить images.dtype.Что это возвращает?Если это dtype('O'), это объясняет вашу проблему: images - это не список, а массив Numpy типа object, который обычно является Bad Idea ™ ️.Технически это будет одномерный массив, содержащий несколько трехмерных массивов.

Массив Numpy лучше всего подходит для использования с числовыми данными.Они достаточно гибки, чтобы содержать произвольные объекты Python, но это сильно ухудшает их функциональность и эффективность.Если у вас нет четкой причины, почему вы должны просто использовать простой список Python [] в этих ситуациях.

Возможно, вам лучше всего преобразовать images в 4D массив, так как этоединственный способ, которым images.nbytes будет работать правильно.Вы не можете сделать это, если ваши изображения имеют разные размеры, но, учитывая, что все они имеют одинаковую форму (x, y, z), это на самом деле довольно просто:

images = np.array([a for a in images])

Теперь images.shape будет (n, x, y, z),где n - общее количество изображений.Вы можете получить доступ к трехмерному массиву, который представляет i -ое изображение, просто индексировав images:

image_i = images[i]

В качестве альтернативы, вы можете преобразовать images в обычный список Python:

images = images.to_list()

Если вы не хотите беспокоиться ни о каком из этих преобразований, вы всегда можете получить размер всех подмассивов с помощью итерации:

totalsize = sum(arr.nbytes for arr in images)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...