【问题标题】:Sampling rows in 2D numpy arrays with replacement使用替换对 2D numpy 数组中的行进行采样
【发布时间】:2017-12-19 00:27:27
【问题描述】:

numpy.random.choice 是一个方便的工具,用于从 一维数组中随机抽取元素

In [94]: numpy.random.choice(numpy.arange(5), 10)
Out[94]: array([3, 1, 4, 3, 4, 3, 2, 4, 1, 1])

但文档指定 a 参数 必须 是一维的。但是,如果我想从二维数组中随机选择行(例如,一个热编码器的随机样本),那么numpy.random.choice 不能再使用了。

所以如果我的输入是:

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])  

我怎样才能从这个数组中以随机方式获取 n 行,像这样? (n = 10)

array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 1.,  0.,  0.]])

【问题讨论】:

    标签: python arrays numpy random


    【解决方案1】:

    根据this 问题,该功能是在 2014 年考虑的,但从那时起没有对 API 进行实质性添加。然而,有一个更好的解决方案,巧妙地利用了numpy.random.choice 和 numpy 的精美索引:

    开始
    In [102]: x = numpy.eye(3); x
    Out[102]: 
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    

    您可以使用numpy.random.choice 生成随机索引列表,如下所示:

    In [103]: i = numpy.random.choice(3, 10); i
    Out[103]: array([2, 2, 0, 2, 1, 1, 2, 0, 0, 1])
    

    然后用i索引x

    In [104]: x[i]
    Out[104]: 
    array([[ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 1.,  0.,  0.],
           [ 0.,  0.,  1.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 0.,  1.,  0.]])
    

    有了这种高效的解决方法,我认为不需要更改 API。

    请注意,对于生成具有特定概率分布的行,过程是相同的。指定指数本身的概率分布。

    【讨论】:

    • 这本质上是一个for循环方法......这有点难看,尤其是对于numpy。难道没有更好的方法吗?
    • @robertotomás 是什么让您认为这本质上是一个 for 循环?这里的一切都是矢量化的。我认为他们还没有想出更好的办法。
    • 我刚刚意识到那不是-t for i in i,它一下子就完成了 :) 谢谢
    猜你喜欢
    • 2016-03-11
    • 2013-12-17
    • 2012-06-06
    • 2017-06-12
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    相关资源
    最近更新 更多