我正在尝试生成一个邻居数组,每个邻居在一个随机混洗(行或列混洗)中都不同于前一个邻居。仅当某行或某列的数目大于K 1时,才应生成邻居;如果是,则应对此行或列进行混洗来生成邻居。改组应该是累加的,这意味着如果先改组一行,然后再改组一列;应该生成两个邻居,一个邻居的行被改组,一个邻居的行和列都被改组。

但是,似乎数组仅被改组了两次,一次是用于列循环,一次是用于行循环,并且这种改组不会累加。

在此示例中,应该对列索引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


谢谢

最佳答案

您的代码有效:)

只是有时候行或列会被打乱,但保持相同的配置。与之比较:

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

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


另外,行或列的元素确实被改组的可能性不大,但是无论如何,最终您将在完全相同的位置得到一和零(因为唯一的排列数量有限)。

关于python - 多个Numpy随机洗牌不累加,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26298762/

10-13 07:23