1
+ #!/usr/bin/env python3
2
+
3
+
1
4
class Matrix :
2
5
"""A simple wrapper around a two-dimensional list"""
3
6
@@ -38,7 +41,7 @@ def __sub__(self, other):
38
41
39
42
def update_order (self ):
40
43
self .order = (len (self ._lst ), len (self ._lst [0 ]))
41
- # количество строк, количество столбцов
44
+ # quantity of rows, quantity of columns
42
45
43
46
def __matmul__ (self , multiplier ):
44
47
if self .order [1 ] != multiplier .order [0 ]:
@@ -62,7 +65,32 @@ def __imatmul__(self, multiplier):
62
65
return Matrix (self ._lst )
63
66
64
67
def transpose (self ):
65
- self ._lst = list (zip (* self ._lst ))
68
+ if self .order [0 ] == self .order [1 ]:
69
+ self ._transpose_fast ()
70
+ else :
71
+ self ._lst = list (zip (* self ._lst ))
72
+
73
+ def _transpose_fast (self ):
74
+ try :
75
+ assert self .order [0 ] == self .order [1 ]
76
+ except AssertionError :
77
+ msg = "Fast transpose for non-square matrices is not implemented"
78
+ raise NotImplementedError (msg )
79
+
80
+ for j in range (self .order [0 ]):
81
+ for k in range (self .order [1 ]):
82
+ self ._lst [j ][k ] = self ._lst [k ][j ]
83
+
84
+ def main_diagonal (self ):
85
+ cnt = min (self .order )
86
+ return (self [k ][k ] for k in range (cnt ))
87
+
88
+ def antidiagonal (self ):
89
+ cnt = min (self .order )
90
+ return (self [cnt - k - 1 ][k ] for k in range (cnt ))
91
+
92
+ def trace (self ):
93
+ return sum (self .main_diagonal ())
66
94
67
95
def arithmetic_mean (self ):
68
96
s , cnt = 0 , 0
0 commit comments