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 |