我可以理解赋值,浅拷贝和深拷贝之间的区别。但我仍然不清楚视图(c=a
)和作业(c=a.view()
)之间的区别。两者都反映了变化,看起来是一样的如果可能,请提供示例。
我指的是这里的观点:https://docs.scipy.org/doc/numpy-1.11.0/reference/generated/numpy.ndarray.view.html。我不确定这些视图的行为与dict视图(https://docs.python.org/release/3.0.1/library/stdtypes.html#dictionary-view-objects)的行为类似。
答案 0 :(得分:4)
NumPy中的数组对象是一个带有data
指针的ndarray结构,指向数组中的原始值。
b = a
:只需给阵列另一个名字。c = a.view()
:创建数组a
的视图意味着创建一个指向相同原始值的新ndarray结构。以下是示例代码:
import numpy as np
a = np.array([1,2,3])
b = a
c = a.view()
print(id(a), id(b), id(c))
print(a.ctypes.data, b.ctypes.data, c.ctypes.data)
输出:
140328594430752 140328594430752 140328594428432
40268384 40268384 40268384
a
和b
具有相同的id
表示它们是同一个对象。data
指针意味着它们共享相同的原始数据。以下是在记忆中创建的内容:
这是关于ndarray struct的文档:
http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.types-and-structures.html#c.PyArrayObject
答案 1 :(得分:2)
Dictionary dictview
与numpy
数组视图无关。它只是{3}},dict.keys()
和dict.values()
在Python3中创建的对象的封面术语。它们更像是生成器,需要dict.items()
包装器。在使用数组时尝试理解这些只会让你感到困惑。
使用list(...)
数组,您需要了解副本和视图之间的区别。这反过来需要基本了解数组对象是什么,以及它如何存储数据。
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#copies-and-views
numpy
b = a
是b
的另一个名称。两个名称都指向同一个数组对象
a
b = a[:]
b = a.view()
b = a[:4]
b = a.reshape(1,-1)
b = np.array(a,copy=False) # but read the np.array docs
是一个新的数组对象,但它与b
共享底层数据缓冲区。 a
中的值的更改将显示在b
中。 a
可能有不同的形状。
b
b = a.copy()
b = a.astype(int)
b = np.array(a, copy=True)
b = a[[1,2,3]]
是一个新数组,并且具有b
数据缓冲区的副本。对a
的更改与b
中的更改无关。