如何只使用循环将一个nbym矩阵转换成一个新的mbyn矩阵?

2024-05-28 20:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

函数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

我在pythonshell中用:transpose([[4,8,10,68],[5,12,8,71],[5.5,11,8,70.5]])尝试了代码,但得到了一个“IndexError:list index outofrange”


Tags: 函数代码innoneforlenreturndef
2条回答

首先,请注意您没有矩阵。相反,您有一个listlists,这是表示矩阵的数学抽象的一种方法。你知道吗

您的代码的问题在于您的轴混淆了:

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)更干净。你知道吗

第三种方法是不用创建填充有Nonelists,而是使用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))

代码的更正版本:

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)),但应该是range(len(a[0])),因为您希望逐列遍历2d数组,第二个错误是range(len(a[i])),而不是range(len(a))。在遍历二维数组的过程中反转了两个轴。你知道吗

在python中,不需要按当前的方式分配内存,因为底层类型只是一个list列表,可以使用append方法添加元素。你知道吗

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

def transpose(a):
  return [[a[x][i] for x in range(len(a))] for i in range(len(a[0]))]

相关问题 更多 >

    热门问题