我正在使用Python实现一个线性代数库(我知道可能已经有类似的库,但我想通过这个项目学习Python和我考试需要的数学知识),我希望能够像下面这样访问矩阵的元素/子集:
(我的矩阵类是tuple的子类。)
- `M = Matrix([元素行列表])` - `M[1, 2]` 获取(1, 2)处的元素 - `M[3]` 获取第三行
这些很容易实现,但我还想实现切片,如下所示:
- `M[:,:]' 返回整个矩阵 - `M[1:6:2]` 返回第1、3和5行 - `M[1:6:2, 0:2]` 返回由第1、3和5行与前两列相交组成的矩阵。
我已经实现了这些功能,但我的代码似乎不太符合Python风格:
这种方法的另一个问题是两个索引都必须是数字或切片,我不能混合使用。如果按照这种方式进行操作,则需要两个以上的elif块,这似乎太多了。代码已经很丑陋了。
我认为答案涉及鸭子类型,但我不完全确定如何实现它。我一直在看try:except:块,但我不知道如何链接它们,而且我不想嵌套太多。
所以,非常感谢阅读。最佳的实现此类函数的方法是什么?
(我的矩阵类是tuple的子类。)
- `M = Matrix([元素行列表])` - `M[1, 2]` 获取(1, 2)处的元素 - `M[3]` 获取第三行
这些很容易实现,但我还想实现切片,如下所示:
- `M[:,:]' 返回整个矩阵 - `M[1:6:2]` 返回第1、3和5行 - `M[1:6:2, 0:2]` 返回由第1、3和5行与前两列相交组成的矩阵。
我已经实现了这些功能,但我的代码似乎不太符合Python风格:
def __getitem__ (self, idx):
if isinstance(idx, numbers.Integral):
# Code to return the row at idx
elif (isinstance(idx, tuple) and len(idx) == 2 and
all(isinstance(i, numbers.Integral) for i in idx)):
# Code to return element at idx
elif (isinstance(idx, tuple) and len(idx) == 2 and
all(isinstance(i, slice) for i in idx)):
# Code to parse slices
这种方法的另一个问题是两个索引都必须是数字或切片,我不能混合使用。如果按照这种方式进行操作,则需要两个以上的elif块,这似乎太多了。代码已经很丑陋了。
我认为答案涉及鸭子类型,但我不完全确定如何实现它。我一直在看try:except:块,但我不知道如何链接它们,而且我不想嵌套太多。
所以,非常感谢阅读。最佳的实现此类函数的方法是什么?
numpy
,它是最突出的已经存在的东西。它可以做你想要的一切甚至更多,并且很可能会使你的代码更易于阅读并且更快。我不想立即提到这一点,因为我不想阻止你享受自己设计的乐趣...但我也希望确保你不会错过玩numpy
的乐趣。 - abarnert