在对象中实现类似numpy的切片

时间:2019-09-14 15:05:57

标签: python-3.x

我正在编写一个稀疏矩阵库(为什么是另一个故事...)

到目前为止,我的基类具有+,-,*等的运算符重载...

最少的代码如下:

class SpMat:
    """
    Matrix in compressed-column or triplet form.
    """
    def __init__(self, m=0, n=0):
        """
        @param m: number of rows
        @param n: number of columns
        """

        # number of rows
        self.m = m

        # number of columns
        self.n = n

        self.data = [[0 for x in range(self.n)] for y in range(self.m)]

    def [i, j]:  # this is what I want to implement

        if isinstance(i, int) and isinstance(j, int):
            return self.data[i][j]
        elif isinstance(i, int) and j = :
            return "the row i"  # will implement it
        elif isinstance(j, int) and i = :
            return "the column j"  # will implement it

因此,在示例代码中,我想实现类似def [i, j]的方式来获取和设置值,但是我不知道如何告诉python在我写myobject[a, b]时要在以下位置获取值坐标a,b,当我写myobject[a, b]= some_value时,我想在坐标a,b处设置值。

1 个答案:

答案 0 :(得分:1)

您可以覆盖类的__getitem__方法。

class SpMat:
    """
    Matrix in compressed-column or triplet form.
    """
    def __init__(self, m=0, n=0):
        """
        @param m: number of rows
        @param n: number of columns
        """

        # number of rows
        self.m = m

        # number of columns
        self.n = n

        self.data = [[0 for x in range(self.n)] for y in range(self.m)]

    def __getitem__(self, key):
        # i and j are integers and you don't need to check the type
        i = key.start  
        j = key.stop
        if isinstance(i, int) and isinstance(j, int):
            return self.data[i][j]
        elif isinstance(i, int) and j = :
            return "the row i"  # will implement it
        elif isinstance(j, int) and i = :
            return "the column j"  # will implement it

如果使用以下语法调用实例,则key参数将是slice对象:instance[1:10]。但是,如果您以如下方式调用实例:instance[1],则键值将是一个整数,其值等于1。

在前一种情况下,您可以通过调用key.start获得第一个参数(在该示例中:1),并在第二个示例中通过调用key.stop获得第二个参数(在该示例中:10)。

因此,最好在方法开始时检查key参数的类型。