在numpy数组中查找切片的位置

kam*_*mpu 5 python numpy slice

我有一个 ndarray 子类,它实现将一个或多个记录加载/保存到平面二进制文件中。加载记录后,我可以以正常的 NumPy 方式访问它们。

我的问题是当我对结果(或者实际上是任何 NumPy 数组)进行切片时会发生什么。这通常会产生一个“视图”,即。引用与父数组相同的缓冲区的数组。

一旦我有了这个视图,有没有办法确定视图 V 在数组 A 中的位置?更准确地说,我想知道 V 开始的字节偏移量(从 A 的数据缓冲区的开始)。这将允许我以正确的偏移量将切片写回磁盘。

下面是一些示例代码来显示这种情况

# Imagine a as consisting of 4 4-byte records...
a = np.arange(16, dtype='B').reshape(4,4)

# I select the first record
v = a[0]

print (v)

# [0 1 2 3]

# I can determine that v is a subarray:

is_subarray = v.base != None

# I can determine which dimension the slice spans..

whichdim = v.base.strides.index (v.strides[-1])

# But not its position along that dimension.
Run Code Online (Sandbox Code Playgroud)

seb*_*erg 6

信息是通过array.__array_interface__(也可能在更好的地方)公开的,但是我认为您可能应该只使用 memmaps 开始而不是乱七八糟。例如检查np.may_share_memory函数的 numpy 代码(或实际上np.byte_bounds)。

  • 实际上,`np.byte_bounds` 是理想的。`np.byte_bounds(V)[0] - np.byte_bounds(V.base)[0]` 给出了 V 到 A 的字节偏移量,可以通过检查 itemsize 和 shape 轻松地将其转换为基于记录的偏移量。 (3认同)