转置已展平的方阵

2024-04-27 02:32:46 发布

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

给定一个表示为列表列表的方阵,您可以transpose it

>>> l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> l_T = list(map(list, zip(*l)))
>>> l_T

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

然后,您可以使用列表理解工具展平列表:

>>> v = [i for j in l for i in j]
>>> v_T = [i for j in l_T for i in j]

>>> v
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> v_T
[1, 4, 7, 2, 5, 8, 3, 6, 9]

我的问题是,有没有一种方法可以将平方矩阵的扁平列表版本重新排列,使其成为转置版本?在这里,这将是从vv_T而无需返回列表列表。我曾试图找出矩阵位置和列表索引之间的关系,但我没有看到这种模式,更不用说可以推广到任何(平方)长度的列表了

为了避免任何XY问题:我最初的目标是能够获得一些简单的列表矩阵列表,并以不同的方式对它们进行迭代(即左>;右,上>;下与上>;下,左>;右)。如果您的起点是l,那么创建转置和解包就很容易了。但是我想象你有平坦矩阵(v)作为起点,你想直接计算v_T。所以我现在真的更好奇这个算法,以及如何在Python中做到这一点


Tags: 工具方法ingt版本map列表for
1条回答
网友
1楼 · 发布于 2024-04-27 02:32:46

首先找到列表长度的平方根,然后迭代地从不同的延迟开始对列表进行切片,直到切片了所有(或者转置的2D数组中的列是什么):

def transpose_flat_list(l):
    n = int(len(l)**.5)
    return [v for i in range(n) for v in l[i::n]]

对于共享示例:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]

transpose_flat_list(l)
# [1, 4, 7, 2, 5, 8, 3, 6, 9]

这也可以通过{}以fortran顺序进行重塑和散开来轻松实现,如下所示:

def transpose_flat_list_numpy(l):
    n = int(len(l)**.5)
    return np.array(l).reshape(n,n).ravel('F').tolist()

transpose_flat_list_numpy(l)
# [1, 4, 7, 2, 5, 8, 3, 6, 9]

相关问题 更多 >