numpy asarray()是指原始列表

时间:2014-09-07 19:40:36

标签: python numpy

我有一个很长的列表列表,我使用numpy.asarray()将它转换为numpy数组,获取此矩阵后删除原始列表是否安全,或者新创建的numpy数组是否也会受到影响通过这个动作?

3 个答案:

答案 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.