在没有 numpy 的情况下使用 类 转置矩阵两次
Transposing matrix twice using classes without numpy
我需要实现一个方法 transpose() returns 一个已经转置的新矩阵。它还必须打印出该矩阵的字符串。它在使用 matrix.transpose() 时有效,但在使用 matrix.transpose().transpose() 时无效,因为 transpose() returns 是一个字符串。
我不能使用 numpy 或向方法添加更多输入。我该怎么做?
from copy import deepcopy
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
copy = deepcopy(self.rows)
transposed = [[copy[j][i] for j in range(len(copy))] for i in range(len(copy[0]))]
matrix = ''
for element in transposed:
for i in element:
matrix += '%2d' % ((i))
matrix += ' '
matrix = matrix[:-1]
matrix += '\n'
return matrix
a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
您可以在打印其内容后在 transpose
和 return 中创建一个新的 Matrix
对象。
为了方便起见,我将您的打印代码移至将矩阵转换为字符串的方法(请注意,名为 __repr__
的方法将由打印隐式调用)。
代码:
from copy import deepcopy
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
copy = deepcopy(self.rows)
transposed = [[copy[j][i] for j in range(len(copy))] for i in range(len(copy[0]))]
transposed_matrix = Matrix(transposed)
print(transposed_matrix)
return transposed_matrix
def __repr__(self):
matrix = ''
for element in self.rows:
for i in element:
matrix += '%2d' % ((i))
matrix += ' '
matrix = matrix[:-1]
matrix += '\n'
return matrix
其他改进:
- 在
transpose
中你可以将矩阵转置改为transposed = list(map(list, zip(*self.rows)))
- 使用格式字符串代替
'%2d' % ((i))
-> f'{i:2}'
join
对格式化矩阵很有帮助:
return '\n'.join(' '.join(f'{i:2}' for i in row) for row in self.rows)
现在完整的代码如下所示
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
transposed = list(map(list, zip(*self.rows)))
transposed_matrix = Matrix(transposed)
print(transposed_matrix)
return transposed_matrix
def __repr__(self):
return '\n'.join(' '.join(f'{i:2}' for i in row) for row in self.rows)
我需要实现一个方法 transpose() returns 一个已经转置的新矩阵。它还必须打印出该矩阵的字符串。它在使用 matrix.transpose() 时有效,但在使用 matrix.transpose().transpose() 时无效,因为 transpose() returns 是一个字符串。 我不能使用 numpy 或向方法添加更多输入。我该怎么做?
from copy import deepcopy
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
copy = deepcopy(self.rows)
transposed = [[copy[j][i] for j in range(len(copy))] for i in range(len(copy[0]))]
matrix = ''
for element in transposed:
for i in element:
matrix += '%2d' % ((i))
matrix += ' '
matrix = matrix[:-1]
matrix += '\n'
return matrix
a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
您可以在打印其内容后在 transpose
和 return 中创建一个新的 Matrix
对象。
为了方便起见,我将您的打印代码移至将矩阵转换为字符串的方法(请注意,名为 __repr__
的方法将由打印隐式调用)。
代码:
from copy import deepcopy
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
copy = deepcopy(self.rows)
transposed = [[copy[j][i] for j in range(len(copy))] for i in range(len(copy[0]))]
transposed_matrix = Matrix(transposed)
print(transposed_matrix)
return transposed_matrix
def __repr__(self):
matrix = ''
for element in self.rows:
for i in element:
matrix += '%2d' % ((i))
matrix += ' '
matrix = matrix[:-1]
matrix += '\n'
return matrix
其他改进:
- 在
transpose
中你可以将矩阵转置改为transposed = list(map(list, zip(*self.rows)))
- 使用格式字符串代替
'%2d' % ((i))
->f'{i:2}'
join
对格式化矩阵很有帮助:return '\n'.join(' '.join(f'{i:2}' for i in row) for row in self.rows)
现在完整的代码如下所示
class Matrix:
def __init__(self, rows):
self.rows = rows[:]
def transpose(self):
transposed = list(map(list, zip(*self.rows)))
transposed_matrix = Matrix(transposed)
print(transposed_matrix)
return transposed_matrix
def __repr__(self):
return '\n'.join(' '.join(f'{i:2}' for i in row) for row in self.rows)