将两个1d数组连接成一个2d数组,并在python中重新洗牌后再次打破它

时间:2018-02-22 13:42:33

标签: python arrays python-2.7 numpy

我有两个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

3 个答案:

答案 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是AL的长度,并在此数组上进行混洗。然后使用此数组重新排列AL

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]]))

参考

Numpy: Rearrange array based upon index array