可能存在从函数返回的方法 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
的原始顺序作为A
和B
?
我正在考虑类似于sklearn.preprocessing.MinMaxScaler((0,+1))
的事情,并且在我回来使用sklearn.inverse_transform()
.
这不一定是可能的,这取决于您选择的f
。 如果f
是可逆的,并且您跟踪行的随机排列方式,即使效率不高,也是可能的。 sklearn.utils shuffle 方法不会"跟踪"矩阵被洗牌的方式。 你可能想自己滚。 要生成随机洗牌,请生成 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
import numpy as np
def shuffle(x):
x_s = x.copy()
x_s.insert(0, x_s.pop())
return x_s
def unshuffle(x, shuffle):
shuffled_ind = shuffle(list(range(len(x))))
rev_shuffled_ind = np.argsort(shuffled_ind)
x_unshuffled = np.array(x)[rev_shuffled_ind].tolist()
return x_unshuffled
x = [1, 2, 3, 4, 5, 6, 7]
x_s = shuffle(x)
print(x_s)
x_r = unshuffle(x_s, shuffle)
print(x_r)
这里回答得很晚。
实际上,你有自己的shuffle()函数。
这个想法是使序列洗牌,并使用 np.argsoft() 获取用于解洗的索引。
希望对您有所帮助!