Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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 当有多个选择时,在numpy数组中查找随机事件_Python_Numpy - Fatal编程技术网

Python 当有多个选择时,在numpy数组中查找随机事件

Python 当有多个选择时,在numpy数组中查找随机事件,python,numpy,Python,Numpy,我编写这段代码是为了实现从匹配谓词条件的元素列表中返回随机值的目标: N=<int> sampl = np.random.randint(low=0, high=N+1, size=(10,)) xs = np.where(sampl == 1) ys = np.array([tuple(x) for x in xs], dtype=int)[0] x = np.random.choice(ys) 它可以工作,但不简洁,我遇到了一些问题,试图使它更优雅 当只传递一个条件时,nump

我编写这段代码是为了实现从匹配谓词条件的元素列表中返回随机值的目标:

N=<int>
sampl = np.random.randint(low=0, high=N+1, size=(10,))
xs = np.where(sampl == 1)
ys = np.array([tuple(x) for x in xs], dtype=int)[0]
x = np.random.choice(ys)
它可以工作,但不简洁,我遇到了一些问题,试图使它更优雅

当只传递一个条件时,numpy.where将返回一个元组。我尝试传递x=sampl,但运行时抱怨说函数没有像我检查代码时那样接受参数。 同样,从元组生成numpy数组迫使我返回第一个元素。在测试诸如谓词未找到值之类的边缘情况时,这很容易出错。
您对改进此代码有什么建议吗?我想继续使用numpy/pandas,因为数组将变得非常大。

我所能想到的最优雅的方法可能是随机洗牌数组,然后完成第一次出现。这应该相当简洁

比如:

np.random.shuffle(sampl)
x = np.ravel(np.where(sampl==1))[0]
或者,正如你所建议的,不拖沓,看起来像

x = np.random.choice(np.ravel(np.where(sampl==1)))
再想一想,我猜选择方法会比洗牌快得多

下一个问题是边缘案例。如何处理这一点取决于您预期的默认行为。如果您预计在大多数情况下,该条件至少会出现一次命中,那么您应该在没有命中的情况下处理该情况,但出现异常:

try: 
   x = np.random.choice(np.ravel(np.where(sampl==1)))
except: 
   # TODO
   pass
我强烈建议你这样做,除非你很少找到成功的机会。但不要相信我的话。。。自己计时

另一种选择是设置一个条件,明确检查

np.size( np.where(sampl==1) ) > 0

在继续之前。但是,我猜这种方法比try…excepta方法慢。

所谓边缘情况,是指没有元素的情况吗?我对您的代码有点困惑。从你所说的来看,在我看来,你可能在寻找类似np.random.choicex[condx]的东西,其中condx是返回布尔掩码的东西,例如examplex>=2。@PaulPanzer我喜欢你的例子,但如何将它保持为一行呢?lambda?你可以直接写np.random.choicex[x>=2]。x>=2是从哪里来的?我很感激你给出的详细答案。不幸的是,我不能洗牌原始数组,因为它也与其他数组并行使用,比如用于测试、有效和训练的ML样本。我想我可以在副本上洗牌,但正如我所写的,数据很大,会导致内存问题。我将研究numpy.ravel,因为它似乎是避免[0]后缀的好方法。但是,我仍然不太确定如何强制numpy.where不返回元组,而是返回numpy.array。调用x=。。。应该有用,对吧?洗牌是个坏主意。别理那些花边新闻。使用随机选择
np.size( np.where(sampl==1) ) > 0