gpt4 book ai didi

python - 转置一个已经展平的方阵

转载 作者:行者123 更新时间:2023-12-05 04:57:14 25 4
gpt4 key购买 nike

给定一个表示为列表列表的方阵,您可以 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 中这样做。

最佳答案

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

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]

这也可以在 NumPy 中通过按 fortran 顺序 reshape 和拼凑来轻松完成:

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]

关于python - 转置一个已经展平的方阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64539359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com