【问题标题】:numpy random.choice elements that are not selected未选择的numpy random.choice 元素
【发布时间】:2014-05-17 13:55:00
【问题描述】:

我有一个数组 A 如下:

import numpy as np
A = np.random.sample(100)

我想从 A 创建 2 个随机子集,如果我将它们组合在一起,我将得到 A

inx = np.random.choice(np.arange(100), size=70, replace=False)
S1 = A[inx]

所以,S1 是子集之一,现在我如何构造 S2 来包含 A 中不在 S1 中的所有元素;换句话说,S2=A-S1。

【问题讨论】:

    标签: python numpy random subset choice


    【解决方案1】:

    设置操作可能会有所帮助:

    S2 = A[list(set(range(100)) - set(inx))]
    

    但你可能需要排序:

    S2 = A[ sorted(list(set(range(100)) - set(inx))) ]
    

    【讨论】:

      【解决方案2】:

      (次要:如果 A 可以有重复的元素,选择索引的补码和让 S2 包含 A 中不属于 S1 的所有元素是不一样的。)

      我可能会完全绕过索引,而是置换元素然后拆分结果:

      >>> A = np.random.sample(10)
      >>> S1, S2 = np.split(np.random.permutation(A), [7])
      >>> S1
      array([ 0.97128145,  0.5617039 ,  0.42625808,  0.39108218,  0.52366291,
              0.73606525,  0.5279909 ])
      >>> S2
      array([ 0.45652426,  0.38622805,  0.99084781])
      

      但也有np.setdiff1d,所以如果你已经有S1

      >>> S2 = np.setdiff1d(A, S1)
      >>> S2
      array([ 0.38622805,  0.45652426,  0.99084781])
      

      【讨论】:

        【解决方案3】:

        我认为这段代码等同于你正在尝试做的事情。

        A = np.random.sample(100)
        T = A[:]
        np.random.shuffle(T)
        
        size = 70
        S1 = T[:size]
        S2 = T[size:]
        

        【讨论】:

        • 这个答案被低估了。它提供了一个简单的解决方案。
        猜你喜欢
        • 2022-12-20
        • 1970-01-01
        • 2018-08-10
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 2017-09-18
        相关资源
        最近更新 更多