这两者之间有什么区别:
array_2 = array_1
array_2 = array_1.view()
我希望有一个例子,演示在第一种情况下将 array_2
更改为 array
会在第二种情况下产生不同的结果。
>>> import numpy as np
>>> array = np.array([-3, -2, -1, 0, 1, 2, 3, 4], dtype=np.int64)
>>> array_view = array.view()
>>> array_alias = array
>>> array_alias is array
True
>>> array_view is array
False
array
和 array_alias
是两个不同的名称,指向相同的 Python 对象,即我们在开始创建的 numpy.ndarray
. array
和 array_view
是两个独立的 Python 对象。>>> array.dtype = np.uint64
>>> array
array([18446744073709551613, 18446744073709551614, 18446744073709551615,
0, 1, 2,
3, 4], dtype=uint64)
>>> array_alias
array([18446744073709551613, 18446744073709551614, 18446744073709551615,
0, 1, 2,
3, 4], dtype=uint64)
但是 视图不会:
>>> array_view
array([-3, -2, -1, 0, 1, 2, 3, 4])
>>> array
array([18446744073709551613, 18446744073709551614, 18446744073709551615,
1337, 1, 2,
3, 4], dtype=uint64)
>>> array_alias
array([18446744073709551613, 18446744073709551614, 18446744073709551615,
1337, 1, 2,
3, 4], dtype=uint64)
>>> array_view
array([ -3, -2, -1, 1337, 1, 2, 3, 4])
以下是另一个示例,使用切片(slice)操作创建numpy对象的视图:
>>> array = np.arange(16)
>>> array
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
>>> array_slice = array[::4]
>>> array_slice
array([ 0, 4, 8, 12])
>>> array is array_slice
False
>>> array_slice.shape = (2, 2)
>>> array_slice
array([[ 0, 4],
[ 8, 12]])
>>> array
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
但是我无法独立操作他们的数据:
>>> array_slice[:] = 1337
>>> array_slice
array([[1337, 1337],
[1337, 1337]])
>>> array
array([1337, 1, 2, 3, 1337, 5, 6, 7, 1337, 9, 10,
11, 1337, 13, 14, 15])
最后要注意的是,np.ndarray.view
方法通常在您想要创建一个 新对象 的情况下调用,这个新对象是原始数组的一个视图,但具有不同的 dtype,因此:
>>> array = np.array([-2, -1, 0, 1, 2], dtype=np.int64)
>>> bytewise = array.view(np.uint8)
>>> bytewise
array([254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
0], dtype=uint8)
我们在现场修改视图形状,来查看64位有符号整数如何以原始字节(即8位整数)表示:
>>> bytewise.shape = array.shape[0], 8
>>> bytewise
array([[254, 255, 255, 255, 255, 255, 255, 255],
[255, 255, 255, 255, 255, 255, 255, 255],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 0, 0, 0, 0, 0, 0, 0],
[ 2, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> array
array([-2, -1, 0, 1, 2])
view()
。更常见的是通过reshape
或甚至transpose
来创建一个view
。更重要的是要学习何时操作会产生view
而不是copy
。 - hpaulj