创建移位矩阵

时间:2014-09-18 19:53:02

标签: python

我正在尝试生成一个以对角方式移动值的矩阵,我不熟悉数学术语,但这必须是默认的。

我的尝试给了我:

[(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用于此目的,但似乎不是那种方式

3 个答案:

答案 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)]]