【问题标题】:How to un-shuffle data?如何取消洗牌数据?
【发布时间】:2017-06-05 03:43:36
【问题描述】:

可能存在从shuffle 函数从sklearn.utils 返回的方法? 我更好地解释了我的问题:我使用shuffle 函数来随机化两个矩阵的行:

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

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

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

【问题讨论】:

  • f 只是一个简单的函数,例如求和。所以,对不起,如果我一直强调你,我该如何做我的个人洗牌功能?我想是这样的:for i in range(len(A)): A_s[i,:] = np.random(A[i,:]) B_s[i,:] = np.random(B[i,:]) 但我怎样才能跟踪订单?

标签: python scikit-learn shuffle


【解决方案1】:

这不一定是可能的,这取决于您选择的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

【讨论】:

  • 非常感谢。但我想知道如何不更改初始矩阵,在您的示例A 中。有这样的方法吗?
  • 只需在函数的最顶部添加行A=np.copy(A)
  • 您的意思是在A = np.array([[1,2],[3,4],[5,6],[7,8]]) 行之后?因为它不起作用。
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 2013-01-15
  • 2018-04-01
  • 2021-11-03
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多