对于matlab的perms函数,是否存在numpy或scipy的等效方法?在matlab中,perms以反向字典顺序返回输入的所有可能排列的矩阵。
答案 0 :(得分:3)
Python有一个名为itertools.permutations
的内置函数。你可以在python中的任何iterable
上调用它,它返回所有的全长排列。
答案 1 :(得分:0)
我写了一个更详细的例子,因为我不清楚如何用第一个答案来实现它:
import numpy as np
import itertools
MyArray = np.arange(3)
permut = itertools.permutations(MyArray)
permut_array = np.empty((0,3))
for p in permut:
permut_array = np.append(permut_array,np.atleast_2d(p),axis=0)
这将返回一个numpy排列数组:
>array([[ 0., 1., 2.],
[ 0., 2., 1.],
[ 1., 0., 2.],
[ 1., 2., 0.],
[ 2., 0., 1.],
[ 2., 1., 0.]])
答案 2 :(得分:0)
此实现与之前的答案类似,但它以反向字典顺序返回数组,以更紧密地匹配 MATLAB 的 perms
。
import numpy as np
import itertools
def perms(x):
"""Python equivalent of MATLAB perms."""
return np.vstack(list(itertools.permutations(x)))[::-1]
用法:
In [1]: perms(range(3))
Out[1]:
array([[2, 1, 0],
[2, 0, 1],
[1, 2, 0],
[1, 0, 2],
[0, 2, 1],
[0, 1, 2]])