0/1矩阵输出

时间:2017-07-13 08:57:23

标签: python numpy

我正在尝试创建一个脚本,该脚本可以让我输出可能用于不同项目优化选择的所有不同组合。简而言之,有6个项目(A B C D E F),每个项目都有2个,3个或6个可能的优化选择,它们是相互排斥的(例如,你不能同时选择F4和F5)。

    import numpy as np

A = range(1, 3)
B = range(1, 3) 
C = range(1, 7) 
D= range(1,3) 
E=range(1,3) 
F=range(1,4) 

length = len(A) + len(B) + len(C) + len(D) + len(E) + len(F) 
nb_projet = len(A) * len(B) * len(C) * len(D) * len(E) * len(F)

result = np.zeros((length, nb_projet))


for k in range(len(A)):
    for i in range(len(A)):
        for j in range(nb_projet):
            result[i, j] = (i+j % len(A)) == k

for k in range(len(B)):
    for i in range(len(B)):
        for j in range(nb_projet):
            result[i + len(A), j] = (i+j % len(B)) == k

for k in range(len(C)):
    for i in range(len(C)):
        for j in range(nb_projet):
            result[i + len(A)+len(B), j] = (i+j % len(C)) == k

for k in range(len(D)):
    for i in range(len(D)):
        for j in range(nb_projet):
            result[i + len(A)+len(B)+len (C), j] = (i+j % len(D)) == k


for k in range(len(E)):
    for i in range(len(E)):
        for j in range(nb_projet):
            result[i + len(A)+len(B)+len (C)+len(D), j] = (i+j % len(E)) == k

for k in range(len(F)):
    for i in range(len(F)):
        for j in range(nb_projet):
            result[i + len(A)+len(B)+len (C)+len(D)+len(E), j] = (i+j % len(F)) == 0


print (result.T)

np.savetxt("ResultsS2.txt", result, delimiter=" ")

如果选择优化,基本上代码应该添加1。目前它只生成6个不同的场景,而不是250个可能的场景。

有没有人知道如何解决这个问题?

非常感谢yu!

2 个答案:

答案 0 :(得分:2)

这只是一堆串联的单热阵列,因此利用second answer heremeshgrid来创建完整的阶乘,你可以这样做:

projects = [2,2,6,2,2,3] #[A.size, B.size, C.size . . .]
m = np.meshgrid(*[np.arange(i) for i in projects])
oneHots = [np.eye(projects[i])[m[i].flat] for i in range(len(projects))]
out = np.hstack(oneHots).T

out.shape
>(17, 288)

答案 1 :(得分:1)

你可以使用这样的东西。不是最聪明的,但如果阵列不是太长,它将完美地工作。

import numpy as np

A = range(0, 2)
B = range(0, 2) 
C = range(0, 6)

length = len(A) + len(B) + len(C)
nb_projet = len(A) * len(B) * len(C)
result = np.zeros((length, nb_projet))

selectedList = []
count = 0
for i in A:
    for j in B:
        for k in C:
            result[(i,count)]= 1
            result[(len(A)+j,count)]=1
            result[(len(A)+len(B)+k, count)] = 1
            count+=1

请注意,我已将范围更改为更适合。