【问题标题】:How to get the remaining indexes after a random set of indexes is selected in Python?在Python中选择一组随机索引后如何获取剩余索引?
【发布时间】:2021-02-21 20:45:36
【问题描述】:

使用下面的代码来说明我的问题。

import numpy as np
np.random.seed(200)
a = np.array([1,21,6,41,8]) # given an array with 5 elements
idx = np.random.choice(5, 3, replace=False) # randomly select 3 indexes between 0 and 4
idx.sort() # sort indexes
print(idx) # [0 3 4]
print(a[idx]) # get random selected subset using the indexes, [ 1 41  8]

如何获取剩余索引[1,2]?

【问题讨论】:

  • 您可以创建一个新列表 remaining = [x for x in range(5) if x not in idx] 或从包含所有索引的列表中弹出随机索引

标签: python numpy random numpy-ndarray


【解决方案1】:

一种方法:

inverted_idx = [x not in idx for x in range(0, len(a))]
print(a[inverted_idx])

结果:

[21  6]

这会创建一个布尔掩码,如果您更喜欢整数掩码,就像您拥有的那样:

inverted_idx = [x for x in range(0, len(a)) if x not in idx]
print(a[inverted_idx])

【讨论】:

    【解决方案2】:
    In [123]: np.random.seed(200)
         ...: a = np.array([1,21,6,41,8]) # given an array with 5 elements
         ...: idx = np.random.choice(5, 3, replace=False) # randomly select 3 indexe
         ...: s between 0 and 4
         ...: idx.sort() # sort indexes
    In [124]: idx
    Out[124]: array([0, 3, 4])
    In [125]: a[idx]
    Out[125]: array([ 1, 41,  8])
    

    我们可以创建一个布尔值mask,并找到真正的索引:

    In [126]: mask = np.ones(a.shape, bool)
    In [127]: mask[idx]=False
    In [128]: mask
    Out[128]: array([False,  True,  True, False, False])
    In [129]: np.nonzero(mask)[0]
    Out[129]: array([1, 2])
    
    In [131]: np.arange(a.shape[0])[mask]
    Out[131]: array([1, 2])
    

    np.delete 进行同样的屏蔽:

    In [132]: np.delete(np.arange(a.shape[0]), idx)
    Out[132]: array([1, 2])
    

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      相关资源
      最近更新 更多