numpy 二维矩阵的置换

lstz6jyr  于 2023-01-13  发布在  其他
关注(0)|答案(3)|浏览(164)

我希望能够在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。
谢谢

6mzjoqzu

6mzjoqzu1#

Transpose the array,然后使用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]]
8ehkhllq

8ehkhllq2#

可以使用zip来转置二维listitertools.product

>>> 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)]
sxissh06

sxissh063#

带product的itertools方法是最可行的方法,但由于您的问题标记为numpy,下面介绍如何仅使用Numpy方法来完成此操作。

1.没有预期顺序的排列

如果顺序对你来说不重要,你可以使用这个方法,它使用np.meshgridnp.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]])

2.具有预期顺序的排列

让这个顺序起作用有点"笨拙",但是对上面的数组进行一个小的修改,对列进行简单的重新排序,就可以用几乎相同的代码解决这个问题。
一个二个一个一个

相关问题