如何取消数据混洗?


问题内容

它可能存在于未来从功能回来的方法shufflesklearn.utils?我可以更好地解释我的问题:我使用shuffle函数来随机化两个矩阵的行:

A_s, B_s = shuffle(A, B, random_state = 1)

接下来A_sB_s在某些操作中,我将同时使用两个矩阵,并获得另一个C_s具有相同维度的矩阵:例如C_s = f(A_s, B_s)。如何返回CasA和as的原始顺序B

我在想类似的东西sklearn.preprocessing.MinMaxScaler((0,+1)),之后又回来使用sklearn.inverse_transform()


问题答案:

根据您对的选择,不一定有可能f。如果f是可逆的,并且您跟踪行的混排方式,即使效率不高,也有可能。sklearn.utils随机播放方法不会“跟踪”矩阵的随机播放方式。您可能需要自己动手。要生成随机随机播放,请生成的随机排列range(len(A)),然后以该顺序迭代交换行。要检索原始矩阵,您可以反转排列。这将允许您针对某些选择f(例如矩阵加法)恢复C。

(编辑,OP请求了其他信息)

这对我有用,但是可能有更有效的方法:

import numpy as np

def shuffle(A,axis=0,permutation=None):
    A = np.swapaxes(A,0,axis)
    if permutation is None:
        permutation = np.random.permutation(len(A))
    temp = np.copy(A[permutation[0]])
    for i in range(len(A)-1):
        A[permutation[i]] = A[permutation[i+1]]
    A[permutation[-1]] = temp
    A = np.swapaxes(A,0,axis)
    return A, permutation

A = np.array([[1,2],[3,4],[5,6],[7,8]])
print A
B, p = shuffle(A) #NOTE: shuffle is in place, so A is the same object as B!!!!
print "shuffle A"
print B
D, _ = shuffle(B,permutation=p[::-1])
print "unshuffle B to get A"
print D

B = np.copy(B)
C = A+B
print "A+B"
print C

A_s, p = shuffle(A)
B_s, _ = shuffle(B, permutation = p)
C_s = A_s + B_s

print "shuffle A and B, then add"
print C_s

print "unshuffle that to get the original sum"
CC, _ = shuffle(C_s, permutation=p[::-1])
print CC