NumPy如何管理数组视图的偏移?以矩阵切片为例
NumPy视图的起始位置存储机制
假设我们有一个2×3的矩阵[[1, 2, 3], [4, 5, 6]],执行以下代码:
>>> import numpy as np >>> a = np.arange(1, 7).reshape(2, 3) >>> a.shape (2, 3) >>> a.strides (24, 8)
将a[1]赋值给变量b(即[4, 5, 6]),已知b是a的视图,b.base与a的底层数组一致,但shape和strides已改变:
>>> b = a[1] >>> b.base array([1, 2, 3, 4, 5, 6]) >>> b.shape (3,) >>> b.strides (8,)
问题
NumPy如何让b从a的元素4开始?np.array的哪个属性存储了该信息?
解答
这个起始位置的信息通过字节偏移量存储,你可以通过以下两个属性查看:
b.data.offset
直接获取视图相对于底层数组的字节偏移量:>>> b.data.offset 24示例中使用的是int64类型数组(每个元素占8字节),24字节对应3个元素的偏移,正好指向原数组中值为4的元素位置。
b.__array_interface__
这是NumPy数组的标准接口,其中data元组的第一个元素是视图数据的起始内存地址,该地址等于底层数组的起始地址加上上述偏移量:>>> b.__array_interface__['data'] (原数组起始地址 + 24, False)
NumPy通过这个偏移量,结合视图的strides和shape属性,从底层数组的对应位置读取数据,从而构建出视图b。
内容的提问来源于stack exchange,提问作者hidetatz
相关产品推荐
相关产品推荐

