我正在尝试生成一个以对角方式移动值的矩阵,我不熟悉数学术语,但这必须是默认的。
我的尝试给了我:
[(0, 0), (1, 1), (2, 2)]
[(3, 0), (4, 1), (5, 2)]
[(6, 0), (7, 1), (8, 2)]
我想要(注意离起点越远,值越高,注意对角线移位)
[(0, 0), (1, 1), (2, 2)]
[(3, 1), (4, 1), (5, 2)]
[(6, 2), (7, 2), (8, 2)]
我曾尝试将collections.deque用于此目的,但似乎不是那种方式
答案 0 :(得分:3)
你需要编写一些循环来处理移位并打开一个新矩阵来接受移位(因为元组是不可变的)。
matrix = [[(0, 0), (1, 1), (2, 2)], [(3, 0), (4, 1), (5, 2)], [(6, 0), (7, 1), (8, 2)]]
shifted_matrix = [[] for _ in range(len(matrix))]
for i in xrange(len(matrix)):
for j in xrange(len(matrix[i])):
if i-j >= 0:
shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1] + i-j))
else:
shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1]))
我不确切地知道'start'矩阵的意思,但我假设你想要一个可以在任何矩阵上调用的函数?这是重新格式化的相同代码,以接受矩阵作为参数并返回移位矩阵。
def diagonalize_matrix(matrix):
shifted_matrix = [[] for _ in range(len(matrix))]
for i in xrange(len(matrix)):
for j in xrange(len(matrix[i])):
if i-j >= 0:
shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1] + i-j))
else:
shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1]))
return shifted_matrix
然后,您可以通过命令行或在您使用它的任何地方通过
来调用它diagonalize_matrix(matrix)
你也可以重新格式化它以接受定义对角线类型的另一个变量(如果它应该从左上角,右上角,左下角,右下角增加),但我不确定我是否完全理解你要求的是什么?
答案 1 :(得分:1)
如果将此处理为两个矩阵而不是单个矩阵矩阵,则问题会更容易:
m1 = [ [0,1,2], [3,4,5], [6,7,8]]
m2 = [ [0,1,2], [0,1,2], [0,1,2]]
def shift (row, pivot):
for idx, item in enumerate(row):
if idx <= pivot:
yield pivot
else:
yield item
def merge (mat1, mat2):
result = []
for r1, r2 in zip (mat1, mat2):
new_row = [(c1, c2) for c1, c2 in zip ( r1, r2)]
result.append(new_row)
return result
shifted =[]
for idx, row in enumerate(m2):
shifted[idx] = [i for i in shift(row, idx)]
print merge (m1, shifted)
#[[(0, 0), (1, 1), (2, 2)], [(3, 1), (4, 1), (5, 2)], [(6, 2), (7, 2), (8, 2)]]
如果您必须支持不同的班次模式,但是您可以将测试作为shift
函数中的lambda传递
答案 2 :(得分:1)
这是一个生成第二个矩阵的单行:
[[(3*i + j, abs(i-j) + min(i,j)) for j in range(3)] for i in range(3)]
生成:
[[(0, 0), (1, 1), (2, 2)],
[(3, 1), (4, 1), (5, 2)],
[(6, 2), (7, 2), (8, 2)]]