我有一个很长的列表列表,我使用numpy.asarray()将它转换为numpy数组,获取此矩阵后删除原始列表是否安全,或者新创建的numpy数组是否也会受到影响通过这个动作?
答案 0 :(得分: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!
答案 1 :(得分:2)
数据被复制,因为numpy数组存储了自己的数据副本,如Bas Swinckels所述。你也可以为自己测试一下。虽然这个简单的小名单也可以说明问题,但下面的巨大数据集可能会让点回家更好一点;)
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])
答案 2 :(得分:1)
是的,如果您的输入数据包含list
,则可以安全删除它。来自文档No copy is performed (ONLY) if the input is already an ndarray.