通过matrix[(a, b), c]访问矩阵元素,而不是matrix[a, b, c]
我想实现以下目标:
- 有一个大小为 AxBxC 的矩阵(其中 A、B、C 是整数)。
- 我希望访问这个矩阵的方式不是用 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]