如何仅使用循环将n×m矩阵转置为新的m×n矩阵?

时间:2019-04-01 03:07:37

标签: python multidimensional-array

函数transpose(a)应该创建一个新矩阵,该矩阵是原始矩阵的转置,并将新矩阵返回给调用方。

这是我以前的尝试之一,如果我仅使用循环,那对我来说最有意义...

def transpose(a):
    m = [None]*len(a[0])

    for i in range(len(a)):
        m[i] = [None]*len(a)
        for j in range(len(a[i])):
            m[i][j] = a[j][i]

    return m

我尝试使用transpose([[4,8,10,68],[5,12,8,71],[5.5,11,8,70.5]])在python shell中执行代码,但收到“ IndexError:列表索引超出范围”

2 个答案:

答案 0 :(得分:0)

首先,请注意您没有矩阵。相反,您拥有list中的lists,这是表示矩阵的数学抽象的一种方法。

您的代码存在的问题就是您将轴混合在一起了:

def transpose(a):
    m = [None] * len(a[0])
    for i in range(len(a[0])):  # len(a[0]) is the number of elements in the inner list, but after transposition it will be the number of elements in the outer list
        m[i] = [None] * len(a)
        for j in range(len(a)):  # and the other way round for len(a)
            m[i][j] = a[j][i]

    return m

也就是说,我建议使用另一种方法。使用enumerate,我们可以同时引用a的元素及其索引

def transpose(a):
    m = [None] * len(a)
    for i, sublist in enumerate(a):
        m[i] = [None] * len(sublist)
        for j, element in enumerate(sublist):
            m[i][j] = element

    return m

这保持了您原始答案的精髓,但是(IMO)更加干净。

第三种方法是省去创建lists并填充None的情况,而改为使用append

def transpose(a):
    m = []
    for i, sublist in enumerate(a):
        m.append([])
        for j, element in enumerate(sublist):
            m[i].append(element)

    return m

最后,为完整起见,请使用基于非循环的方法(请注意,内部元素是tuples而不是lists

def transpose(a):
    return list(zip(*a))

答案 1 :(得分:0)

正确的代码版本:

def transpose(a):
    m = [None]*len(a[0])

    for i in range(len(a[0])):
        m[i] = [None]*len(a)
        for j in range(len(a)):
            m[i][j] = a[j][i]

    return m

遍历数组时犯了两个小错误,第一个循环是range(len(a)),但是当您想逐列通过2d数组时应该是range(len(a[0])),第二个错误是{ {1}},而不是range(len(a[i]))。在遍历2d数组时,您将两个轴翻转了。

在python中,您不需要按照自己的方式分配内存,因为底层类型只是列表的列表,因此可以使用range(len(a))方法来添加元素。

您可以尝试以下使用列表理解概念的代码。

append