Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从满足某些条件的数组中随机排除/删除元素?_Python_Arrays_Numpy_Random - Fatal编程技术网

Python 如何从满足某些条件的数组中随机排除/删除元素?

Python 如何从满足某些条件的数组中随机排除/删除元素?,python,arrays,numpy,random,Python,Arrays,Numpy,Random,例如,如果我有一个1x100数组,它包含90个0,我想以某种方式排除随机选择的80个0。我已经为这个问题挣扎了一段时间,但不幸的是,我几乎没有取得什么进展。这是一种方法,它不是很有效,但应该是健壮的 def progressivelyExcludeItem(item, arr, maxExclusions): """ @param item the item value that will be progressively excluded

例如,如果我有一个1x100数组,它包含90个0,我想以某种方式排除随机选择的80个0。我已经为这个问题挣扎了一段时间,但不幸的是,我几乎没有取得什么进展。

这是一种方法,它不是很有效,但应该是健壮的

def progressivelyExcludeItem(item, arr, maxExclusions):
    """
    @param item the item value that will be progressively excluded
    @param arr the list from which we will exclude
    @param maxExclusions the maximum number of excluded items 
    """

    excludeIndices = [i for i, x in enumerate(arr) if x == item]
    excludeIndices = random.shuffle(excludeIndices)[:maxExclusions]

    for i in excludeIndices.sort().reversed():
        arr.pop(i)

时间复杂度为O(n^2)。

因为您有一个
numpy
标记:

将numpy导入为np
def溶液(arr、值、大小):
返回np.delete(arr,np.random.choice(np.flatnonzero(arr==值),size,False))
arr=np.数组([0]*90+[1]*10)
np.random.shuffle(arr)
打印(解决方案(arr,0,80))#[1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 1]
打印(解决方案(arr,0,90))#[1]
打印(解决方案(arr,0,100))#引发错误(预期行为)

普通Python方法

确定符合标准的元素指数:

candidate_indices = [i for i, x in enumerate(data) if data == 0]
选择要删除的索引:

removed_indices = random.sample(candidate_indices, 80)
通过构建一个不包含相应元素的列表来删除它们:

result = [x for i, x in enumerate(data) if i not in removed_indices]

你能把你的过滤函数设计成概率的吗?例如:
lambda x:x!=0和random.random()>0.2
。然后你过滤掉80%的x元素,这些x元素是0。选择你想要保留的元素更容易。然后,简单地用列表/数组进行索引。您期望的输出是什么?你想保留原始数组,还是删除80个0的新数组?@Nick我的目标是获得80个0的新数组,这样新数组的形状将是1x20。我认为这段代码不起作用。如果弹出第i个元素,较大的索引将全部移位,现在随机洗牌不再与现有数组匹配。我认为您应该首先构建一个要排除的索引列表,然后使用这些索引过滤数组(我认为在numpy中应该有一种简单的方法来实现这一点),事实上,这是一个典型的错误。修复只是向后迭代,我现在就编辑它(目前仍然存在相同的bug,因为您反转了一个无序数组,请参阅我上面的修复注释)啊,是的,确实如此。您需要首先获取与零值匹配的所有索引。然后在那部分做一些随机的剪接。我真的应该开始更好地复习我的答案了。。。现在应该好了。谢谢你的帮助:)