代码1
arr = np.array([1, 2, 3])
arr2 = arr.view()
代码2
arr = np.array([1, 2, 3])
arr2 = arr
这两个片段都有相同的功能,所以如果我们可以简单地用代码2实现相同的结果,为什么我们实际上需要NumPy中的view
方法?
即使不使用view
允许您做的事情,语义也是不同的。
arr2 = arr
这将原始数组的引用赋给一个不同的名称。当你访问arr
时,你对arr2
所做的任何更改(不包括重新分配)都会显示。
arr2 = arr.view()
创建一个新的数组对象,它只与原来的数组对象共享数据。您可以在不影响arr
的情况下执行arr2.shape = (3, 1, 1)
之类的操作。
同时,这不是view
通常用来做的。假设您想要查看组成整数的单个字节。您将创建一个具有不同dtype的视图:
arr2 = arr.view(np.uint8)
或者你想把你的整数重新解释为大-而不是小-端:
arr2 = arr.view('>i4')
请记住,许多其他有用的操作也这样做,如reshape
(相同的dtype,不同的形状),transpose
(相同的dtype,不同的步幅),等等。
如documentation
所示:
a.view(some_dtype)
或a.view(dtype=some_dtype)
用不同的数据类型构造数组的内存视图。这可能导致内存字节的重新解释。
所以你可以创建一个不同类型的数组,如下所示:
>>> arr = np.array([1,2,3])
>>> arr2 = arr.view(dtype=np.int8)
>>> arr2
array([1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
0, 0], dtype=int8)
>>> arr2 = arr.view(dtype=np.int32)
array([1, 0, 2, 0, 3, 0], dtype=int32)
#You can change type and dtype like below
>>> arr2 = arr.view(dtype=np.int64, type=np.matrix)
>>> arr2
matrix([[1, 2, 3]])
如果你在view
和assign
下面这样写:
>>> arr2 = arr.view(dtype=np.int64)
>>> arr2.dtype
dtype('int64')
>>> arr3 = arr
>>> arr3.dtype
dtype('int64')