LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 232|回复: 0

复杂数组

[复制链接]
发表于 2024-1-25 18:01:06 | 显示全部楼层 |阅读模式


NumPy-风格:形状和步幅
NumPy 风格数组的逻辑结构由 itemsize 、 ndim 、 shape 和 strides 定义。

如果 ndim == 0 , buf 指向的内存位置被解释为大小为 itemsize 的标量。这时, shape 和 strides 都为 NULL。

如果 strides 为 NULL,则数组将被解释为一个标准的 n 维 C 语言数组。否则,消费者程序必须按如下方式访问 n 维数组:

ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];
item = *((typeof(item) *)ptr);
如上所述,buf 可以指向实际内存块中的任意位置。输出者程序可以用该函数检查缓冲区的有效性。

def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
    """Verify that the parameters represent a valid array within
       the bounds of the allocated memory:
           char *mem: start of the physical memory block
           memlen: length of the physical memory block
           offset: (char *)buf - mem
    """
    if offset % itemsize:
        return False
    if offset < 0 or offset+itemsize > memlen:
        return False
    if any(v % itemsize for v in strides):
        return False

    if ndim <= 0:
        return ndim == 0 and not shape and not strides
    if 0 in shape:
        return True

    imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] <= 0)
    imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
               if strides[j] > 0)

    return 0 <= offset+imin and offset+imax+itemsize <= memlen
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表