【发布时间】:2012-09-07 10:57:15
【问题描述】:
我有一个 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.
【问题讨论】:
-
为什么不在自定义类中沿视图存储所需的信息(dim + index)?
-
@NicolasBarbey 当然,我可以这样做...... OTOH NumPy 已经知道该切片的位置。复制这些信息似乎很愚蠢(不是有某种方法可以从 NumPy 获取这些信息吗?)
-
不是memmaps对你更有用吗?当然有可能得到它......但很好,不确定。
-
@Sebastian Memmaps 很好,但他们目前有一些问题让我想远离他们。主要的一个是不能保证数组子类被保留,因为 a[0]['x'] 和 a['x'][0] 不都返回一个常规的数组(其中一个返回一个' numpy.void',最终结果是不一致的行为 WRT 返回标量值)。这一直是很多挫折的根源。我想对行为本身的东西进行子类化(如 ndarray)