【问题标题】:Find location of slice in numpy array在 numpy 数组中查找切片的位置
【发布时间】: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)

标签: python numpy slice


【解决方案1】:

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

【讨论】:

  • 谢谢!!!!特别是给出如此详细的答案......相信我,我希望我能继续使用memmaps。我已经给了他们很长一段时间的尝试(几年),因为我认为他们是在这里使用的东西,就像我说的......他们工作时很好,不工作时令人困惑。我会试试这个。
  • 其实np.byte_bounds 是理想的。 np.byte_bounds(V)[0] - np.byte_bounds(V.base)[0] 给出 V 到 A 的字节偏移量,可以通过检查 itemsize 和 shape 轻松转换为基于记录的偏移量。
  • 一个小警告。在不同的 numpy 版本中,如果您基于视图制作视图,ndarray.base 可能会指向不同的数组。 IE。您可能必须多次执行.base 才能获得我相信的原始版本(我认为这可能会在下一个版本中更改为始终直接指向原始版本)。
  • 是的,在 1.6.2 中似乎就是这种情况,感谢您的提醒 :)
  • @kampu 你的 memmap 有什么问题?它们传播得很奇怪(x+x 提供了一个新的 memmap,但实际上不是),但如果这是您的问题之一,我认为有一个简单的解决方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多