我有一个2D NumPy数组(N, D)
,其中每一行都有一个唯一索引(一个非负整数)。行的索引正在增加。例如,我的(4,D)
数组的索引可以是(10, 20, 21, 30)
。
我正在寻找一个允许我的数据结构:
从索引中选择行:arr[21]
而不是arr[2]
(即绝对索引而不是相对索引)
将绝对索引的任意列表转换为相对索引,反之亦然。例如,在[10, 30, 21, 21]
和[0, 3, 2, 2]
之间来回转换。
实施此最简洁的方法是什么?
创建一个全新的类,包装数据(NumPy数组)和索引。实施__getitem__
,__setitem__
等
创建一个派生自ndarray
的类并重写索引,以便使用绝对索引。
为数据和索引保存单独的对象(均为NumPy数组),实现select(data, index)
等函数,并在代码中的任何位置使用它。
与(3)类似,但索引是自定义类的实例,提供index.to_relative(data)
和index.to_absolute(data)
等方法
使用蒙面数组。
我相信我们还能找到其他方法。我可以找到所有这些方法的利弊。最干净的方法是什么?有没有“标准”的做法,我不知道?
答案 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"因为第一个不需要任何其他功能或类定义,第二个使得使用非常简单和直观。