通过matrix[(a, b), c]访问矩阵元素,而不是matrix[a, b, c]

0 投票
2 回答
2085 浏览
提问于 2025-04-15 15:53

我想实现以下目标:

  1. 有一个大小为 AxBxC 的矩阵(其中 A、B、C 是整数)。
  2. 我希望访问这个矩阵的方式不是用 matrix[a, b, c],而是用 matrix[(a, b), c]。也就是说,我有两个变量,var1 = (x, y) 和 var2 = z,我想用 matrix[var1, var2] 来访问我的矩阵。

这怎么实现呢?我在使用 numpy 矩阵,如果这有什么影响的话。

我知道可以用 matrix[var1[0], var1[1], var2] 来访问,但如果可能的话,我想知道有没有其他更优雅的方法。

谢谢!

2 个回答

1

我觉得你可以简单地创建一个新的类,继承NumPy的矩阵类型,然后重写一下__getitem__()这个方法,让它可以接受一个元组。大概可以这样做:

class SpecialMatrix(np.matrix):
    def __getitem__(self, arg1, arg2, arg3=None):
        try:
            i, j = arg1
            k = arg2
            assert(arg3 is None)
            x = super(SpecialMatrix, self).__getitem__(i, j, k)
        except TypeError:
            assert(arg3 is not None)
            return super(SpecialMatrix, self).__getitem__(arg1, arg2, arg3)

然后对__setitem__()做类似的处理。

我不太确定__getitem__()是否可以像我这里展示的那样接受多个参数,还是说它只接受一个元组,或者其他什么的。写这个回答的时候我没有NumPy可用,抱歉。

编辑:我把例子改成用super()来调用父类,而不是直接调用基类。已经有一段时间没在Python中做子类化的事情了。

编辑:我刚看了被接受的答案。那确实是正确的方法。我把这个留着,以防有人觉得有帮助,但简单的方法是最好的。

3

如果 var1 = (x,y),而 var2 = z,你可以使用

matrix[var1][var2]

撰写回答