2014-09-07 3 views
3

У меня очень длинный список списка, и я преобразовываю его в массив numpy с помощью numpy.asarray(), безопасно ли удалить исходный список после получения этой матрицы или сделать Это действие также повлияет на новый массив numpy.is numpy asarray() относится к исходному списку

ответ

3

Я уверен, что данные не используются и вы можете безопасно удалить списки. Ваш исходный matrix является вложенной структурой объектов Python, причем сами номера также являются объектами Python, которые могут быть расположены повсюду в памяти. Массив Numpy также является объектом, но он более или менее представляет собой заголовок, который содержит размеры и тип данных, с указателем на непрерывный блок данных, где все числа упаковываются как можно ближе, как «сырые числа», , Нет никакого способа, как эти два разных способа могли бы обмениваться данными, поэтому, вероятно, данные копируются при создании массива Numpy. Пример:

In [1]: m = [[1,2,3],[4,5,6],[7,8,9]] 
In [2]: import numpy as np 
In [3]: M = np.array(m) 
In [4]: M[1,1] = 55 
In [5]: M 
Out[5]: 
array([[ 1, 2, 3], 
     [ 4, 55, 6], 
     [ 7, 8, 9]]) 
In [6]: m 
Out[6]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # original is not modified! 

Обратите внимание, что Numpy массивы могут обмениваться данными между друг с другом, например, когда вы делаете срез в массив. Это называется «вид», так что если вы измените данные в подмножестве, он также будет меняться в исходном массиве:

In [18]: P = M[1:, 1:] 
In [19]: P[1,1] = 666 
In [20]: P 
Out[20]: 
array([[ 55, 6], 
     [ 8, 666]]) 
In [21]: M 
Out[21]: 
array([[ 1, 2, 3], 
     [ 4, 55, 6], 
     [ 7, 8, 666]]) # original is also modified! 
+0

NumPy массив и список можно с уверенностью обмениваться данными, по крайней мере, когда DTYPE является объектом: 'd = [[1, 2, 'foo'], ['12', 13]]; np.asarray (d) [0] - d [0] -> True'. Теперь изменение элементов во внутреннем списке также повлияет на элементы массива. Но дело в том, что удаление этого списка (если только делеция не применяется delslice во внутренних списках) не повлияет на массив вообще, потому что удаление просто приводит к уменьшению суммы refcount в . –

+0

Я предположил, что мы говорили о числах, но да, когда dtype является объектом, объекты в матрице остаются неизменными. Но вы все равно можете безопасно удалить списки, я думаю, поскольку объекты затем удерживаются живым массивом Numpy. –

+0

Спасибо @BasSwinckels и Ashwini – Lanc

1

Да, это безопасно удалить его, если ваш ввод данных состоит из list. Из документации No copy is performed (ONLY) if the input is already an ndarray.

+1

Спасибо за ответ – Lanc

2

Данные копируются из-за того, что массив numpy хранит свою собственную копию данных, как описано Bas Swinckels. Вы можете проверить это и для себя. Хотя тривиальным небольшой список мог бы отметить также, что GINORMOUS набор данных ниже может привести точку дома немного лучше;)

import numpy as np 
list_data = range(1000000000) # note, this will probably take a long time 

# This will also take a long time 
# because it is copying the data in memory 
array_data = np.asarray(list_data) 

# even this will probably take a while 
del list_data 

# But you still have the data even after deleting the list 
print(array_data[1000]) 
+0

Спасибо за ответ! Я действительно пробовал это и как-то в одном из запусков, массив numpy был затронут, но я никогда не смог воспроизвести сценарий, поэтому, возможно, какая-то ошибка с моей стороны – Lanc

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