关于如何在Python中存储numpy数组的一些困惑
在Python中使用数据类型numpy数组时,我有一些困惑 问题1 我在python intepreter中执行以下脚本关于如何在Python中存储numpy数组的一些困惑,python,arrays,numpy,Python,Arrays,Numpy,在Python中使用数据类型numpy数组时,我有一些困惑 问题1 我在python intepreter中执行以下脚本 >>> import numpy as np >>> L = [1000,2000,3000] >>> A = np.array(L) >>> B = A 然后我检查以下内容: >>> A is B True >>> id(A) == id(B) True >&
>>> import numpy as np
>>> L = [1000,2000,3000]
>>> A = np.array(L)
>>> B = A
然后我检查以下内容:
>>> A is B
True
>>> id(A) == id(B)
True
>>> id(A[0]) == id(B[0])
True
那很好。但是当时发生了一些奇怪的事情
>>> A[0] is B[0]
False
但是A[0]和B[0]怎么可能是不同的东西呢?他们有相同的身份证!
对于python中的列表,我们有
>>> LL = [1000,2000,3000]
>>> SS = LL
>>> LL[0] is SS[0]
True
存储numpy数组的方法与list完全不同?我们也有
>>> A[0] = 1001
>>> B[0]
1001
似乎A[0]和B[0]是相同的对象
问题2
我复印了一份
>>> C = A[:]
>>> C is A
False
>>> C[0] is A[0]
False
那很好。A和C似乎彼此独立。但是
>>> A[0] = 1002
>>> C[0]
1002
A和C似乎不是独立的?我完全糊涂了。你在问两个完全独立的问题,所以这里有两个答案
A[0]
和A[0]
也是不同的对象:
>>> A[0] is A[0]
False
这就是为什么Numpy可以以更节省内存的方式存储数组的核心:它不为每个条目存储完整的Python对象,只在需要时动态创建这些对象。它针对阵列上的矢量化操作而不是单个元素访问进行了优化C=A[:]
时,您正在为相同的数据创建一个新视图。你不是在复制。然后将有两个不同的包装器对象,分别由A
和C
指向,但它们由相同的缓冲区支持。数组的base
属性指的是它最初从中创建的数组对象:
>>> A.base is None
True
>>> C.base is A
True
当与索引结合使用时,相同数据上的新视图特别有用,因为您可以获得仅包含原始数组的某些片段,但由相同内存支持的视图
要实际复制数组,请使用copy()
方法作为更一般的说明,您不应该过多地阅读Python中的对象标识。一般来说,如果
x是y
为真,您就知道它们实际上是同一个对象。但是,如果返回false,则它们仍然可以是同一对象的两个不同代理。列表和数组的存储完全不同。请参阅回答,numpy v list copy。相关: