【问题标题】:How to delete the same random items from multiple arrays of equal length?如何从多个相等长度的数组中删除相同的随机项?
【发布时间】:2012-08-02 09:57:57
【问题描述】:

我有几个大小为 (20000,1) 且内容不同的数组。我想随机删除每个数组所有行的 25%,这样每个数组都会删除同一行。 我发现的一个相当乏味的方法如下:

import numpy as np

a=np.array(range(1000))
b=np.array(np.random.rand(1000))
seed=np.random.randint(0,100000000)     #picking a random seed
np.random.seed(seed)      #Setting the same seed for each deletion
a[np.random.rand(*a.shape) < .25] = 0
np.random.seed(seed)
b[np.random.rand(*b.shape) < .25] = 0
a=a[a !=0]
b=b[b !=0]

这种方法有几个问题,例如如果数组已经包含零怎么办? 有更好的方法吗?

【问题讨论】:

    标签: python arrays numpy python-2.7


    【解决方案1】:

    这是一个非常笼统的非 numpy 解决方案:

    import random
    to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))
    
    #do this for each array:
    new_array = np.array(item for index, item in enumerate(old_array) if index in to_keep)
    
    • total_rows是每个数组的行数(我想你说这是20,000)

    • keep_ratio 是要保留的行的百分比,根据您的说法是1 - 0.25 = 0.75

    编辑

    你也可以使用numpy的compress()方法。

    import random
    to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))
    kompressor = (1 if i in to_keep else 0 for i in xrange(total_rows))
    
    new_array = numpy.compress(kompressor, old_array, axis=1)
    kompressor
    

    【讨论】:

      【解决方案2】:

      基于 Joel Cornett 的解决方案并对其进行了扩展:

      import numpy as np
      
      length = 20000
      limit = int(0.75*length)
      keep = np.random.permutation(length)[:limit]
      
      newArray = oldArray[keep]
      

      【讨论】:

      • 谢谢,这正是我想要的。
      【解决方案3】:

      我不知道它与 numpy 的效果如何,但这是我在纯 Python 中使用的:

      total = len(a)
      toss = int(0.25 * total)
      keeping = [False] * toss + [True] * (total - toss)
      random.shuffle(keeping)
      a = [value for value, flag in zip(a, keeping) if flag]
      b = [value for value, flag in zip(b, keeping) if flag]
      

      【讨论】:

        【解决方案4】:

        与 Theodros 的回答类似,但保留了元素的原始顺序:

        import numpy as np
        
        mask = np.ones(len(a), dtype=bool)
        mask[:len(a)/4] = 0
        np.random.shuffle(mask)
        
        a = a[mask]
        b = b[mask]
        

        【讨论】:

          猜你喜欢
          • 2013-11-30
          • 2021-05-28
          • 2016-09-05
          • 2022-11-24
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多