2015-09-04 4 views
3

Когда я сжимаю массив numpy, используя метод resize (т. Е. Массив становится меньше из-за resize), гарантировано ли, что копия не создана?Изменение размера массива NumPy до меньшего размера без копирования

Пример:

a = np.arange(10)   # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
a.resize(5, refcheck=False) # array([0, 1, 2, 3, 4]) 

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

+1

Если ваш новый размер всегда будет меньше, то почему бы не нарезать массив и не присвоить себе? – EdChum

+0

@EdChum: Вы имеете в виду 'a = a [: 5]'? Честно говоря, я не думал об этом. Однако я не знаю, как нарезка работает внутри. Будет ли это работать без копии данных, которые будут сделаны где-то? – luator

ответ

3

Массив numpy - это массив фиксированного размера в фоновом режиме, любой тип изменения размера всегда будет копировать массив.

Сказав это, вы можете создать срез массива эффективно только с использованием подмножества массива без необходимости изменения размера/копирования.

>>> import numpy 
>>> a = numpy.arange(10) 
>>> b = a[:5] 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b 
array([0, 1, 2, 3, 4]) 
>>> 
>>> a += 10 
>>> a 
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 
>>> b 
array([10, 11, 12, 13, 14]) 
>>> 
>>> b += 10 
>>> a 
array([20, 21, 22, 23, 24, 15, 16, 17, 18, 19]) 
>>> b 
array([20, 21, 22, 23, 24]) 
+0

Спасибо, я не знал, что могу использовать нарезку для этого. Однако у этого есть одно предостережение: память для неиспользуемой части 'a' не выпущена (это может быть проблемой в некоторых случаях). Что произойдет, если я сделаю 'del a'? Будет ли он хранить полные данные или он достаточно умен, чтобы сохранить только часть, доступную через 'b'? – luator

+1

Выполняя 'del a', он будет держать' a' полностью, потому что он все еще существует. 'b' отображает только небольшую часть' a', но она все еще там. Единственный способ освободить память - это скопировать ее в новый массив и удалить старый. В фоновом режиме numpy просто создает стандартный 'malloc' /' free' при создании/удалении массивов, и это невозможно для 'free' части массива в c. – Wolph

+0

И еще один вопрос: зачем «изменять размер» нужно сделать копию при сжатии массива? Я не разбираюсь в том, как работает распределение памяти, но разве нельзя просто освободить самую заднюю часть выделенной памяти и сохранить переднюю часть без копирования чего-либо? – luator

Смежные вопросы