【问题标题】:Using Numpy's random.choice to randomly remove item from list使用 Numpy 的 random.choice 从列表中随机删除项目
【发布时间】:2016-09-02 00:29:08
【问题描述】:

根据http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html,使用replace = False和Numpy的random.choice方法应该可以使样本无需替换。但是,这似乎对我不起作用:

In [33]: import numpy as np

In [34]: arr = range(5)

In [35]: number = np.random.choice(arr, replace = False)

In [36]: arr
Out[36]: [0, 1, 2, 3, 4]

采样后数组arr 仍然是range(5),并且没有像我预期的那样丢失(随机)数字。我如何从range(5) 中抽取一个数字而不进行替换?

【问题讨论】:

  • np.random.choice 不会改变原始数组。它并不是从数组中直接采样。
  • 您没有将其分配回arr
  • @Divakar 这将是 OP 正在寻找的补充。
  • "我如何从 range(5) 中抽取一个数字而不进行替换?"对于单个数字,“有或无”部分并不重要。如果你想对两个数字进行采样,你只需 np.random.choice(arr, 2, replace=False)
  • @juanpa.arrivillaga 好吧,我不确定 OP 在寻找什么,但由于 OP 提到:array arr is still range(5),因此我之前的评论。

标签: python numpy random


【解决方案1】:

正如其中一个 cmets 所述,np.choice 从一个序列中选择有或没有替换的一系列数字。但它不会修改序列。

简单的选择

arr = range(5)
# numbers below will never contain repeated numbers (replace=False)
numbers = np.random.choice(arr, 3, replace=False) 

我认为你想要的行为是:

arr = range(5)
all_but_one = np.random.choice(arr, len(arr) -1, replace=False)

因此您将选择 N-1 个数字而不进行替换(以避免重复),从而有效地从可迭代中删除随机元素。

更高效的替代方案

arr = range(5)
random_index = np.random.randint(0, len(arr))
arr.pop(random_index)

【讨论】:

    【解决方案2】:

    我最终使用random 库定义了一个函数:

    import random
    def sample_without_replacement(arr):
        random.shuffle(arr)
        return arr.pop()
    

    它的用途如下图:

    In [51]: arr = range(5)
    
    In [52]: number = sample_without_replacement(arr)
    
    In [53]: number
    Out[53]: 4
    
    In [54]: arr
    Out[54]: [2, 0, 1, 3]
    

    请注意,该方法还会在适当的位置对数组进行洗牌,但对于我而言,这并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2016-10-23
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多