python - 自定义索引的数据结构

标签 python numpy indexing

我希望编写一个数据结构来表示一些遗传数据。此数据可以表示为大小为 n 的列表,其中每个条目还有一个“遗传位置”,它是 0 到 1 之间的实数。为了使命名更清楚,我将其称为位置在列表 id 和遗传位置 gpos 中。我实现它的方式是作为一个类

class Coords(object):

    def __init__(self, *args, **kwargs):
        self.f = list(*args, **kwargs)
        self.r = dict()
        for i,e in enumerate(self.f):
            self.r[e] = i

    def __setitem__(self,x,y):
        self.f.__setitem__(x,y)
        self.r.__setitem__(y,x)

    def __getitem__(self,x):
        return self.f.__getitem__(x)

    def __len__(self):
        return self.f.__len__()

现在,我有两个问题。第一个是 self.r 的索引是 float ,这显然是个坏主意。我正在考虑将它们转换为字符串(具有固定位数),但是有更好的主意吗?我遇到的另一个问题是我想通过 gpos 实现访问条目,所以如果我想访问 gpos 0.2 和 0.4 之间的所有内容,我会喜欢能够使用

import numpy as np
Coords(np.arange(1,0,-.1))
c.r[0.2:0.4]

有没有简单的方法来定义它?我正在考虑使用二进制搜索找到开始和结束位置的正确 id,然后使用这些 id 访问 self.f,但是有没有办法实现上述语法?

最佳答案

当您使用切片索引对象时,Python 会使用您提供的输入创建一个 slice 对象。例如,如果您执行 c[0.2:0.4],则传递给 c.__getitem__ 的参数将为 slice(0.2, 0.4) .所以你可以在你的 __getitem__ 方法中有这样的代码:

def __getitem__(self, x):
    if isinstance(x, slice):
        start = x.start
        stop = x.stop
        step = x.step
        # Do whatever you want to do to define your return
    ...

如果你不想在 Coords 对象上使用这种奇特的索引,而是在 self.r 字典中使用,我认为最简单的方法是创建一个 FancyIndexDictdict的子类,修改它的__getitem__方法,然后让self.r成为一个 FancyIndexDict,不是 dict

关于python - 自定义索引的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18478024/

相关文章:

MongoDB 索引用于查找和排序

arrays - 单个项目的索引使用 ANY(ARRAY[...])

python - numpy数组的计算/操作

c# - IronPython 无法导入模块 os

python - 不需要的 python feedparser 实例化遗迹

python - 如何使用 bot.sendAudio() 从 url 发送音频

Python;将向量附加到数组

python - np.argsort 如何在 pandas DataFrame 中工作?

python - 在 for 循环中向后索引整个数组

python - 使用两个隐式循环迭代数组