如何取消数据混洗?
问题内容:
它可能存在于未来从功能回来的方法shuffle
从sklearn.utils
?我可以更好地解释我的问题:我使用shuffle
函数来随机化两个矩阵的行:
A_s, B_s = shuffle(A, B, random_state = 1)
接下来A_s
,B_s
在某些操作中,我将同时使用两个矩阵,并获得另一个C_s
具有相同维度的矩阵:例如C_s = f(A_s, B_s)
。如何返回C
asA
和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