Python 从布尔数组中随机选择的一个真元素获取索引

Python 从布尔数组中随机选择的一个真元素获取索引,python,numpy,random,Python,Numpy,Random,我有一个布尔数组,从中我想要一个随机选择的元素的索引等于True。输出应该是一个具有该元素(x,y,z)索引的元组 是否有一种更优雅和/或有效的方法来完成这项工作,而不是执行以下操作 import numpy as np rng = np.random.RandomState(42) # create a random 3D boolean array m = rng.choice(a=[False, True],size=(3,3,3)) # get (x,y,z) from one ra

我有一个布尔数组,从中我想要一个随机选择的元素的索引等于True。输出应该是一个具有该元素(x,y,z)索引的元组

是否有一种更优雅和/或有效的方法来完成这项工作,而不是执行以下操作

import numpy as np
rng = np.random.RandomState(42)

# create a random 3D boolean array
m = rng.choice(a=[False, True],size=(3,3,3))

# get (x,y,z) from one random cell in the boolean array which equals True
indices_where_true = np.where(m)
random_int = rng.randint(len(indices_where_true[0]),size=1)
random_index = (indices_where_true[0][random_int][0],
                indices_where_true[1][random_int][0],
                indices_where_true[2][random_int][0])

使用
np.argwhere
代替
np.where

true_idx = np.argwhere(m)

random_idx = rng.randint(len(true_idx),size=1)
random_index = true_idx[random_idx]
# array([[0, 1, 2]])

各国文件中的说明:

当只提供了
条件时,此函数是
np.asarray(condition).nonzero()的缩写。最好直接使用
nonzero
,因为它对子类的行为是正确的

因此,您应该将
where
替换为
非零
。对一个随机整数进行采样后,您可以通过沿
索引的第一个轴获取该索引处的所有元素来拾取坐标,其中_true
使用:

从numpy导入随机
rng=np.random.RandomState(42)
#创建随机三维布尔数组
m=rng.choice(a=[False,True],size=(3,3,3))
#从布尔数组中等于True的一个随机单元格中获取(x,y,z)
指数,其中,真=np.非零(m)
random_int=rng.randint(len(索引,其中为真[0]),size=1)
随机索引=np.take(索引=true,随机整数,轴=1)

这似乎是最具可读性的解决方案。请注意,我要求提供一个元组,也许您可以在您的帖子中添加以下内容(或更好的选择):
random\u index=true\u idx[random\u idx][0]random\u index=(random\u index[0]、random\u index[1]、random\u index[2])