numpy array/matrix 值的排列
Permutation of values on numpy array/matrix
我正在寻找可以加快置换矩阵创建速度的代码。
即,我想创建一个 n 列矩阵,其中每个列值迭代 m 个值,在每行上创建一个 n^m 组合。
在下面的示例中,有两种创建矩阵的方法,在本例中,n=7 和 m=5 创建的矩阵类似于:
1 1 1 1 1 1 1
1 1 1 1 1 1 2
1 1 1 1 1 1 3
1 1 1 1 1 1 4
1 1 1 1 1 1 5
1 1 1 1 1 2 1
...
5 5 5 5 5 5 5
行的顺序无关紧要,重要的是创建了所有组合。
我已经编写了以下 2 个方法来创建数组,但是 metod1 非常慢(虽然非常冗长且易于理解),而 method2 使用 numpy 函数更快。但我仍然需要找到一种更快的方法来创建矩阵。
import numpy as np
############################################
def permArray_meth1():
allArray = np.zeros((1,7))
for a1 in range(1,6):
for a2 in range(1,6):
for a3 in range(1,6):
for a4 in range(1,6):
for a5 in range(1,6):
for a6 in range(1,6):
for a7 in range(1,6):
allArray = np.append(allArray, np.array([a1,a2,a3,a4,a5,a6,a7]).reshape(1,7), axis=0)
allArray = np.delete(allArray, 0, 0)
return allArray
############################################
def permArray_meth2():
##### Create permutation matrix #####
a = np.arange(np.power(5,7)).reshape(5,5,5,5,5,5,5)
allArray = [(a1,a2,a3,a4,a5,a6,a7) for a1,a2,a3,a4,a5,a6,a7 in np.ndindex(a.shape)]
##### Convert list to array #####
allArray = np.asarray(allArray)+1
return allArray
############################################
if __name__ == "__main__":
allArray = permArray_meth1() # (50sec)
print 'allArray1', np.shape(allArray)
allArray = permArray_meth2() # (1sec)
print 'allArray2', np.shape(allArray)
我知道速度还取决于所使用的 CPU 硬件,但我正在寻找比上面显示的相对更快的代码。
还有其他的method/code吗?
您可以通过使用 np.indices()
为 第 1 列、第 2 列...、第 n 列创建一个 (n, m, m, ..., m)
索引数组来实现此目的,然后将输出重塑为 (n ** m, n)
数组:
import numpy as np
def permgrid(m, n):
inds = np.indices((m,) * n)
return inds.reshape(n, -1).T
例如:
print(permgrid(2, 3))
# [[0 0 0]
# [0 0 1]
# [0 1 0]
# [0 1 1]
# [1 0 0]
# [1 0 1]
# [1 1 0]
# [1 1 1]]
我正在寻找可以加快置换矩阵创建速度的代码。 即,我想创建一个 n 列矩阵,其中每个列值迭代 m 个值,在每行上创建一个 n^m 组合。 在下面的示例中,有两种创建矩阵的方法,在本例中,n=7 和 m=5 创建的矩阵类似于:
1 1 1 1 1 1 1
1 1 1 1 1 1 2
1 1 1 1 1 1 3
1 1 1 1 1 1 4
1 1 1 1 1 1 5
1 1 1 1 1 2 1
...
5 5 5 5 5 5 5
行的顺序无关紧要,重要的是创建了所有组合。 我已经编写了以下 2 个方法来创建数组,但是 metod1 非常慢(虽然非常冗长且易于理解),而 method2 使用 numpy 函数更快。但我仍然需要找到一种更快的方法来创建矩阵。
import numpy as np
############################################
def permArray_meth1():
allArray = np.zeros((1,7))
for a1 in range(1,6):
for a2 in range(1,6):
for a3 in range(1,6):
for a4 in range(1,6):
for a5 in range(1,6):
for a6 in range(1,6):
for a7 in range(1,6):
allArray = np.append(allArray, np.array([a1,a2,a3,a4,a5,a6,a7]).reshape(1,7), axis=0)
allArray = np.delete(allArray, 0, 0)
return allArray
############################################
def permArray_meth2():
##### Create permutation matrix #####
a = np.arange(np.power(5,7)).reshape(5,5,5,5,5,5,5)
allArray = [(a1,a2,a3,a4,a5,a6,a7) for a1,a2,a3,a4,a5,a6,a7 in np.ndindex(a.shape)]
##### Convert list to array #####
allArray = np.asarray(allArray)+1
return allArray
############################################
if __name__ == "__main__":
allArray = permArray_meth1() # (50sec)
print 'allArray1', np.shape(allArray)
allArray = permArray_meth2() # (1sec)
print 'allArray2', np.shape(allArray)
我知道速度还取决于所使用的 CPU 硬件,但我正在寻找比上面显示的相对更快的代码。
还有其他的method/code吗?
您可以通过使用 np.indices()
为 第 1 列、第 2 列...、第 n 列创建一个 (n, m, m, ..., m)
索引数组来实现此目的,然后将输出重塑为 (n ** m, n)
数组:
import numpy as np
def permgrid(m, n):
inds = np.indices((m,) * n)
return inds.reshape(n, -1).T
例如:
print(permgrid(2, 3))
# [[0 0 0]
# [0 0 1]
# [0 1 0]
# [0 1 1]
# [1 0 0]
# [1 0 1]
# [1 1 0]
# [1 1 1]]