2014-10-10 55 views
1

我试图生成一个邻居数组,每个邻居在一个随机洗牌中不同于前一个邻居,无论是行或列洗牌。只有在特定的行或列的K 1多于一个的情况下才会生成邻居,如果是,则应该生成一个邻居,并将该行或列进行混洗。洗牌应该是叠加的,这意味着如果第一行被洗牌,然后是一列;应该生成两个邻居,一个具有混洗行,另一个具有混洗行和列的两个邻居。多个Numpy随机洗牌不加起来

但是,似乎该数组只是洗牌两次,一个用于列循环,另一个用于行循环,而混洗不加起来。

在这个例子中,列索引1和2应该被混洗,并且行索引3和4.下面是一个输出示例,显示了生成的邻居:

[[0 0 0 1 1] 
[0 0 1 0 0] 
[1 1 0 0 0] 
[0 1 1 1 0] 
[1 1 1 0 1]] 

[[0 0 0 1 1] 
[0 0 1 0 0] 
[0 0 1 0 1] 
[0 1 1 1 0] 
[1 1 1 0 1]] 

[[0 0 0 1 1] 
[0 0 1 0 0] 
[0 0 1 0 1] 
[0 1 1 1 0] 
[1 1 1 0 1]] 

[[0 0 0 1 1] 
[0 0 1 0 0] 
[0 0 1 0 1] 
[0 1 1 1 0] 

下面是代码:

k=2 
tmp = np.array([ 
[0, 0, 0, 1, 1] 
,[0, 0, 1, 0, 0] 
,[1, 1, 0, 0, 0] 
,[0, 1, 1, 1, 0] 
,[1, 1, 1, 0, 1] 
    ]) 

board = np.copy(tmp) 
column = np.sum(board, axis=0)-k 
columns = len(column) 
row = np.sum(board, axis=1)-k 
rows = len(row) 
neighbors = [] 

for i in range(columns): 
    if column[i] > 0: 
     np.random.shuffle(board[:,i]) 
     neighbors.append(np.copy(board)) 

for i in range(rows): 
    if row[i] > 0: 
     np.random.shuffle(board[i,:]) 
     neighbors.append(np.copy(board)) 

print tmp 
print column 
print row 
for i in neighbors: 
    print i 

感谢

回答

1

你的代码工作:)

它只是有时行或列被混洗,但停留在相同的配置。比较:

ar = np.array([0, 1]) 

for _ in range(10): 
    print ar 
    np.random.shuffle(ar) 

此外,这不是不可能的行或列的元素确实洗牌,但你会在相同的位置一和零反正结束(因为只有一个有限唯一排列的数量)。