You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的哪个属性存储了该信息?

解答

这个起始位置的信息通过字节偏移量存储,你可以通过以下两个属性查看:

  1. b.data.offset
    直接获取视图相对于底层数组的字节偏移量:

    >>> b.data.offset
    24
    

    示例中使用的是int64类型数组(每个元素占8字节),24字节对应3个元素的偏移,正好指向原数组中值为4的元素位置。

  2. b.__array_interface__
    这是NumPy数组的标准接口,其中data元组的第一个元素是视图数据的起始内存地址,该地址等于底层数组的起始地址加上上述偏移量:

    >>> b.__array_interface__['data']
    (原数组起始地址 + 24, False)
    

NumPy通过这个偏移量,结合视图的strides和shape属性,从底层数组的对应位置读取数据,从而构建出视图b。

内容的提问来源于stack exchange,提问作者hidetatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:30:10