NumPy索引数组的数据结构

时间:2014-10-02 14:47:02

标签: python arrays numpy indexing

我有一个2D 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. 使用蒙面数组。

  6. 我相信我们还能找到其他方法。我可以找到所有这些方法的利弊。最干净的方法是什么?有没有“标准”的做法,我不知道?

1 个答案:

答案 0 :(得分:0)

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

对于(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])

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

根据程序的复杂程度,我会直接使用它,或者按照你的建议创建一个封装它的类。我认为这两种方法都可以被认定为" clean"因为第一个不需要任何其他功能或类定义,第二个使得使用非常简单和直观。