numpy shuffle有约束

时间:2014-10-24 18:39:26

标签: python arrays numpy

我想改组1-d numpy数组,其约束条件是没有元素匹配来自相同形状的另一个数组的相应元素(即,相同的索引)。可以假设每个数组的所有元素都是唯一的。

例如,

a = np.arange(10)
b = a.copy()
np.random.shuffle(b)
np.where(a==b) # This should be empty

最好的方法是什么?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

改编自georg的回答here

def random_derangement(n):
    while True:
        v = np.arange(n)
        for j in np.arange(n - 1, -1, -1):
            p = np.random.randint(0, j+1)
            if v[p] == j:
                break
            else:
                v[j], v[p] = v[p], v[j]
        else:
            if v[0] != 0:
                return v

答案 1 :(得分:1)

def random_derangement(N):
    original = np.arange(N)
    new = np.random.permutation(N)
    same = np.where(original == new)[0]
    while len(same) != 0:
        swap = same[np.random.permutation(len(same))]
        new[same] = new[swap]
        same = np.where(original == new)[0]
        if len(same) == 1:
            swap = np.random.randint(0, N)
            new[[same[0], swap]] = new[[swap, same[0]]]
    return new