numpy中view()方法的目的是什么?



代码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]])

如果你在viewassign下面这样写:

>>> arr2 = arr.view(dtype=np.int64)
>>> arr2.dtype
dtype('int64')

>>> arr3 = arr
>>> arr3.dtype
dtype('int64')

最新更新