【问题标题】:Data structure for NumPy indexed array [closed]NumPy 索引数组的数据结构
【发布时间】:2014-10-02 14:47:01
【问题描述】:

我有一个二维 NumPy 数组 (N, D),其中每一行都有一个唯一索引(非负整数)。行的索引正在增加。例如,我的(4,D) 数组的索引可以是(10, 20, 21, 30)

我正在寻找一种数据结构,它允许我:

  • 从索引中选择行:arr[21] 而不是 arr[2](即绝对索引而不是相对索引)

  • 将任意绝对索引列表转换为相对索引,反之亦然。比如在[10, 30, 21, 21][0, 3, 2, 2]之间来回转换。

什么是最简洁的实现方式?

  1. 创建一个全新的类,包装数据(NumPy 数组)和索引。实现__getitem____setitem__

  2. 创建一个派生自 ndarray 的类并覆盖索引以使用绝对索引。

  3. 为数据和索引保留单独的对象(都作为 NumPy 数组),实现 select(data, index) 之类的函数,并在代码的任何地方使用它。

  4. 和(3)一样,但是索引是自定义类的实例,提供index.to_relative(data)index.to_absolute(data)等方法

  5. 使用掩码数组。

我相信人们还可以找到其他方法。我可以找到所有这些方法的优缺点。最干净的方法是什么?有没有我不知道的“标准”方式?

【问题讨论】:

  • 我不明白这个问题。当你说(N, D)时,你的意思是你有一个N维数组吗?而且,当您说索引可能是(10, 20, 21, 30) 时,您的意思是这就是您的数组的形状吗?您能否举例说明您正在尝试做什么,以及它是如何不起作用的?
  • 3.使用函数将是最简单的。但是,如果您更喜欢索引表示法 ([]) 而不是参数表示法,np.lib.index_tricks 提供了实现自定义 __getitem__ 函数的类示例。
  • @farenorth 我已经澄清了这个问题。我的数组是二维的,形状是(N, D)(10, 20, 21, 30) 只是与行关联的任意整数(在这种情况下,有四行,因此 N=4)。我知道如何实现所有 5 种方法,但我不确定哪一种最干净。
  • @CyrilleRossant 我现在明白了。你有没有考虑过这个:docs.scipy.org/doc/scipy/reference/generated/…
  • 另外,在我看来你在问两个问题:1)在用户空间中实现这种方法的“最干净”的方法是什么,这似乎是一个风格问题,以及2)什么是大型阵列最快/最有效的方法。最快的方法可能规定了实现的子集,但如果您真的在寻找最有效的方法,您应该要求这样做。我不是速度方面的专家,但如果我是你,我会尝试运行一些速度测试:scipy.sparse.csr_matrix、dict 查找、列表查找(@asimoneau 的解决方案)。然后选择一个看起来合适的实现。

标签: python arrays numpy indexing


【解决方案1】:

我认为没有标准的方法可以做到这一点,但实施起来并不太复杂。

对于(3),如果你使用索引列表而不是数组,你可以使用index方法来获取一个值的索引:

i = [10,20,21,30]
x = numpy.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
x[i.index(20)] # -> array([4,5,6])

当然你不能使用它来分配,修改结构可能会很痛苦。

根据程序的复杂性,我会按照您的建议直接使用它或创建一个封装它的类。我认为这两种方法都可以称为“干净”,因为第一种方法不需要任何其他函数或类定义,而第二种方法使使用变得非常简单和直观。

【讨论】:

  • 我忘了说:我的数组很大(N 可以有 1 亿个元素,D 可能在 1 到 1000 之间),我可能需要在相对坐标和绝对坐标之间转换数百万个索引。我不确定list.index 将如何扩展到这些卷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2012-08-06
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多