假设我创建一个整数列表列表以反映3 x 3矩阵:
矩阵= [[1,2,3],[4,5,6],[7,8,9]]来反映矩阵:
1 2 3
4 5 6
7 8 9
在数学文献和阅读中,我们通常以(x,y)形式引用矩阵的条目。因此,如果我们想知道第1行第3列中的条目,我们会考虑矩阵的(0,2)条目,条目是值3.
当然,当它实际返回值7时,矩阵[0] [2]可能会错误。为了得到值3,我们必须将列表条目位置切换到矩阵[2] [0 ]。
除了操纵矩阵的构造,创建另一个数据结构,或者创建另一个列表列表之外,Python还有一种方法可以切换入口位置吗?这样:
modifiedList [x] [y] == originalList [y] [x]
答案 0 :(得分:1)
您可以使用zip:
创建一个迭代器,聚合来自每个迭代的元素
list(zip(*matrix))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
*
用于传递元素列表(unpacking the arguments),而不是单个列表。所以上面*
的效果是,zip的参数将是:(1,4,7),(2,5,8),(3,6,9),即:
list(zip((1, 4, 7), (2, 5, 8), (3, 6, 9))
答案 1 :(得分:0)
这就是所谓的换位。如果您正在使用numpy ndarray,您只需要调用ndarray.transpose来获取交换轴的视图。如果你真的想要列表列表,那么转换并不难:
>>> list(map(list,zip(*matrix)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
请注意,numpy的视图可以满足您的要求,提供一个不会改变底层数据结构但只改变索引的视图。 zip方式创建了一整套新列表。您还可以创建一个将getitem映射到另一个行为的代理对象,但numpy已经以更有效的形式(对于数字矩阵)具有该代理对象。