我希望能够在python中生成一个二维数组的所有唯一排列并保持顺序。假设我有一个二维矩阵[[1, 2, 3], [4, 5, 6]]。预期结果应该是[[1, 2, 3],[1, 2, 6],[1, 5, 3],[1, 5, 6],[4, 2, 3],[4, 2, 6],[4, 5, 3],[4, 5, 6]]形式的8 x 3中的a。谢谢
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3],
[1, 2, 6],
[1, 5, 3],
[1, 5, 6],
[4, 2, 3],
[4, 2, 6],
[4, 5, 3],
[4, 5, 6]]
6mzjoqzu1#
Transpose the array,然后使用itertools.product:
itertools.product
from itertools import product list(map(list, product(*zip(*data))))
这将输出:
[[1, 2, 3], [1, 2, 6], [1, 5, 3], [1, 5, 6], [4, 2, 3], [4, 2, 6], [4, 5, 3], [4, 5, 6]]
8ehkhllq2#
可以使用zip来转置二维list和itertools.product。
zip
list
>>> from itertools import product >>> lst = [[1, 2, 3], [4, 5, 6]] >>> list(product(*(zip(*lst)))) # If you want to get each `tuple` as `list` # >>> list(map(list, product(*zip(*lst)))) [(1, 2, 3), (1, 2, 6), (1, 5, 3), (1, 5, 6), (4, 2, 3), (4, 2, 6), (4, 5, 3), (4, 5, 6)]
sxissh063#
带product的itertools方法是最可行的方法,但由于您的问题标记为numpy,下面介绍如何仅使用Numpy方法来完成此操作。
如果顺序对你来说不重要,你可以使用这个方法,它使用np.meshgrid和np.stack加上一些.reshape来得到你需要的排列,减去你期望的顺序。
np.meshgrid
np.stack
.reshape
import numpy as np lst = [[1, 2, 3], [4, 5, 6]] arr = np.array(lst) np.stack(np.meshgrid(*arr.T),-1).reshape(-1,3)
array([[1, 2, 3], [1, 2, 6], [4, 2, 3], [4, 2, 6], [1, 5, 3], [1, 5, 6], [4, 5, 3], [4, 5, 6]])
让这个顺序起作用有点"笨拙",但是对上面的数组进行一个小的修改,对列进行简单的重新排序,就可以用几乎相同的代码解决这个问题。一个二个一个一个
3条答案
按热度按时间6mzjoqzu1#
Transpose the array,然后使用
itertools.product
:这将输出:
8ehkhllq2#
可以使用
zip
来转置二维list
和itertools.product
。sxissh063#
带product的itertools方法是最可行的方法,但由于您的问题标记为numpy,下面介绍如何仅使用Numpy方法来完成此操作。
1.没有预期顺序的排列
如果顺序对你来说不重要,你可以使用这个方法,它使用
np.meshgrid
和np.stack
加上一些.reshape
来得到你需要的排列,减去你期望的顺序。2.具有预期顺序的排列
让这个顺序起作用有点"笨拙",但是对上面的数组进行一个小的修改,对列进行简单的重新排序,就可以用几乎相同的代码解决这个问题。
一个二个一个一个