我有两个1d数组A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
及其标签L = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
;其中L[i]
是A[i]
的标签。
目标:我需要随机改组1d数组,使其标签保持在同一索引中。
例如:洗牌后:
A= [2, 4, 9, 1, 3, 6, 0, 7, 5]
然后
L= [7, 5, 0, 8, 6, 3, 9, 2, 4]
,A[i]
和L[i]
应与原始版本保持一致。
我在考虑将上述两个1d数组连接成一个2d数组并重新洗牌,然后再将两个1d数组分开。它不起作用。我被重新洗牌了。
以下是我尝试的代码
import numpy as np
import random
# initializing the contents
A = np.arange(0,10)
length= len(A)
print length
print A
labels = np.zeros(10)
for index in range(length):
labels[index] = A[length-index-1]
print labels
# end, contents ready
combine = []
combine.append([A, labels])
print combine
random.shuffle(combine)
print "After shuffle"
print combine
答案 0 :(得分:2)
如果您正在使用Numpy,请使用numpythonic方法。使用CalendarDetails
创建对,并使用np.column_stack
函数将其随机播放:
numpy.random.shuffle
演示:
pairs = np.column_stack((A, L))
np.random.shuffle(pairs)
如果你想获得数组,只需做一个简单的索引:
In [16]: arr = np.column_stack((A, L))
In [17]: np.random.shuffle(arr)
In [18]: arr
Out[18]:
array([[4, 5],
[5, 4],
[7, 2],
[1, 8],
[3, 6],
[6, 3],
[8, 1],
[2, 7],
[9, 0],
[0, 9]])
答案 1 :(得分:1)
你的想法是朝着正确的方向发展的。你只需要一些 Python-Fu :
from random import shuffle
A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
res = list(zip(A, L))
shuffle(res) # shuffles in-place!
A, L = zip(*res) # unzip
print(A) # -> (4, 0, 2, 1, 8, 7, 9, 6, 5, 3)
print(L) # -> (5, 9, 7, 8, 1, 2, 0, 3, 4, 6)
如果您想知道它是如何工作的,请详细解释unzipping操作。
答案 2 :(得分:0)
您还可以保留索引数组np.arange(size)
,其中size是A
和L
的长度,并在此数组上进行混洗。然后使用此数组重新排列A
和L
。
idx = np.arange(10)
np.random.shuffle(idx) # or idx = np.random.shuffle(np.arange(10))
A = np.arange(100).reshape(10, 10)
L = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
L[idx], A[idx]
# output
(array([2, 5, 1, 7, 8, 9, 0, 6, 4, 3]),
array([[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]]))
参考