为了账号安全,请及时绑定邮箱和手机立即绑定

大量选择以产生具有所有唯一值的2D数组

大量选择以产生具有所有唯一值的2D数组

慕姐8265434 2019-11-04 09:40:48
所以我想知道是否存在一种更有效的解决方案,该方法使用np.random.choice每行具有唯一值的位置生成二维数组。例如,对于具有shape的数组(3,4),我们期望输出为:# Expected output given a shape (3,4)array([[0, 1, 3, 2],       [2, 3, 1, 0],       [1, 3, 2, 0]])这意味着每行的值在列数方面必须是唯一的。因此,对于中的每一行out,整数应仅介于0到3之间。我知道,我可以通过传递实现它False的replace论据。但是我只能为每一行而不是整个矩阵执行此操作。例如,我可以这样做:>>> np.random.choice(4, size=(1,4), replace=False)array([[0,2,3,1]])但是当我尝试这样做时:>>> np.random.choice(4, size=(3,4), replace=False)我收到这样的错误: File "<stdin>", line 1, in <module> File "mtrand.pyx", line 1150, in mtrand.RandomState.choice  (numpy\random\mtrand\mtrand.c:18113) ValueError: Cannot take a larger sample than population when  'replace=False'我认为这是因为3 x 4 = 12由于矩阵的大小,它试图绘制样本而不进行替换,但我只给出了极限4。我知道我可以通过使用解决for-loop: >>> a = (np.random.choice(4,size=4,replace=False) for _ in range(3)) >>> np.vstack(a) array([[3, 1, 2, 0],        [1, 2, 0, 3],        [2, 0, 3, 1]])但是我想知道是否有一种不使用任何for循环的解决方法?(我有点假设,如果我的行数大于1000,则添加for循环可能会使速度变慢。但是如您所见,我实际上是在创建生成器,a因此我也不知道它是否有效果毕竟。)
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我经常使用的一个技巧是生成一个随机数组,并argsort用于获取唯一索引作为所需的唯一数字。因此,我们可以-


def random_choice_noreplace(m,n, axis=-1):

    # m, n are the number of rows, cols of output

    return np.random.rand(m,n).argsort(axis=axis)

样品运行-


In [98]: random_choice_noreplace(3,7)

Out[98]: 

array([[0, 4, 3, 2, 6, 5, 1],

       [5, 1, 4, 6, 0, 2, 3],

       [6, 1, 0, 4, 5, 3, 2]])


In [99]: random_choice_noreplace(5,7, axis=0) # unique nums along cols

Out[99]: 

array([[0, 2, 4, 4, 1, 0, 2],

       [1, 4, 3, 2, 4, 1, 3],

       [3, 1, 1, 3, 2, 3, 0],

       [2, 3, 0, 0, 0, 2, 4],

       [4, 0, 2, 1, 3, 4, 1]])

运行时测试-


# Original approach

def loopy_app(m,n):

    a = (np.random.choice(n,size=n,replace=False) for _ in range(m))

    return np.vstack(a)

时间-


In [108]: %timeit loopy_app(1000,100)

10 loops, best of 3: 20.6 ms per loop


In [109]: %timeit random_choice_noreplace(1000,100)

100 loops, best of 3: 3.66 ms per loop


查看完整回答
反对 回复 2019-11-04
?
万千封印

TA贡献1891条经验 获得超3个赞

如果我x不更换就进行采样,那意味着我所取的样本量为<len(x),否则该样本将始终相同x,除了顺序。所以,如果我想随机抽样y的元素x,此方法将确保我可以从第一个绘制y的价值x..

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 691 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信