当使用以下代码时:
x=np.arange(6).reshape(3,2)
y=x.view()
print(x)
print(y)
print(id(x),id(y)) ### 内存不一样
x=np.arange(12)
y1=x[3:]
print(id(x),',',id(y1),',',id(x[3:])) ### 3个内存都不一样,不知道为什么
使用以上两个产生视图的方法时会发现视图和原数组的内存地址不一样,但是“数组视图是由原数组生成的另一个数组,但是与原数组共享数组元素内存,是对同一个内存位置所存储数组元素的不同呈现”。相当于对视图操作,就是对原数组也进行操作,按理来说应该是同一个内存,但为什么使用id打印出来的却不一样,这里面用的是什么机制,感谢各位的解惑!
视图(View)是Numpy中的一个对象,它不是新的数组,只是以不同的方式对原有数组进行了切片,但可以(通过指数或切片)访问原数组的相同数据区域。因此,视图与原有数组共享相同的数据,但在内存中的位置不一样。
具体地说,当使用numpy中的视图生成方法时,会创建一个新的视图数组,但这个数组与原始数组共享内部数据。这是因为Numpy中的视图通过修改Numpy数组对象的一小部分元数据来确保它们与原始数组共享数据。这些元数据包括描述数组数据存储方式的指针和形状,但不包括数据自身。
通过查看Numpy数组对象的内部元数据,我们可以判断一个数组是否是视图。下面是一个示例代码:
import numpy as np
a = np.arange(9).reshape([3,3])
b = a[:,0]
print(a.array_interface) print(b.array_interface)
输出结果为:
{'data': (22492352, False), 'strides': None, 'descr': [('', '<i8')], 'typestr': '<i8', 'shape': (3, 3)}
我们发现,a和b共享相同的数据('data'属性相同),但是b的元数据中'shape'和'strides'属性表示它只是一个拥有一列的一维数组(而a是二维数组),因为b只是一个视图。
因此,Numpy中的视图是通过元数据和数据的共享来实现的,这种机制可以有效地提高计算速度和内存效率,同时使数组操作更加方便和灵活。