【发布时间】: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]之间来回转换。
什么是最简洁的实现方式?
创建一个全新的类,包装数据(NumPy 数组)和索引。实现
__getitem__、__setitem__等创建一个派生自
ndarray的类并覆盖索引以使用绝对索引。为数据和索引保留单独的对象(都作为 NumPy 数组),实现
select(data, index)之类的函数,并在代码的任何地方使用它。和(3)一样,但是索引是自定义类的实例,提供
index.to_relative(data)和index.to_absolute(data)等方法使用掩码数组。
我相信人们还可以找到其他方法。我可以找到所有这些方法的优缺点。最干净的方法是什么?有没有我不知道的“标准”方式?
【问题讨论】:
-
我不明白这个问题。当你说
(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