视图和赋值之间的区别

时间:2016-06-17 22:04:08

标签: python numpy dictionary scipy

我可以理解赋值,浅拷贝和深拷贝之间的区别。但我仍然不清楚视图(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)的行为类似。

2 个答案:

答案 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
  • ab具有相同的id表示它们是同一个对象。
  • 都具有相同的data指针意味着它们共享相同的原始数据。

以下是在记忆中创建的内容:

enter image description here

这是关于ndarray struct的文档:

http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.types-and-structures.html#c.PyArrayObject

答案 1 :(得分:2)

Dictionary dictviewnumpy数组视图无关。它只是{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中的更改无关。