我想改组1-d numpy数组,其约束条件是没有元素匹配来自相同形状的另一个数组的相应元素(即,相同的索引)。可以假设每个数组的所有元素都是唯一的。
例如,
a = np.arange(10)
b = a.copy()
np.random.shuffle(b)
np.where(a==b) # This should be empty
最好的方法是什么?有什么想法吗?
答案 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