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

标签 python list matrix transpose

给定一个表示为列表列表的方阵,您可以 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/

相关文章:

python - 导入错误 : cannot import name CountryField

python - 比较 2 个 python 列表最多 n-2 个元素

python - 在 python 中比较由具有唯一键的字典组成的 2 个列表

list - 如何检查 slice 是否在 GO 中的 slice 内?

android - 矩阵镜像和刻度

matrix - kdb 矩阵函数改进

python - 将字符串添加到 h5 文件

python - Django 表单不显示,只有按钮(新)

python - 在 python 中组合列表

android - 如何在 Android 中从 4 边更改 View 的大小?