Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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_Random_Indexing - Fatal编程技术网

Python numpy数组中非零值的随机索引

Python numpy数组中非零值的随机索引,python,numpy,random,indexing,Python,Numpy,Random,Indexing,我希望以前没有人问过这个问题。我不知道该如何重新表述这个问题。这是非常相似的,但仍然不完全是我要找的 我有一个长度可变的numpy数组(介于4-12之间)。数组的值为0或1。我想从数组中获取随机样本的索引,它不是0 我的想法是这样做: def sample(self): flag = 0 while flag == 0: sampleValue = randint(0, len(myArray())-1) flag

我希望以前没有人问过这个问题。我不知道该如何重新表述这个问题。这是非常相似的,但仍然不完全是我要找的

我有一个长度可变的numpy数组(介于4-12之间)。数组的值为0或1。我想从数组中获取随机样本的索引,它不是0

我的想法是这样做:

def sample(self):
        flag = 0
        while flag == 0:
            sampleValue = randint(0, len(myArray())-1)
            flag = myArray()[sampleValue]
        return sampleValue

但这并不是很好的代码,最终会陷入一个永无止境的while循环。当然我可以改进这个。很有可能在python中有一种更漂亮的方法来实现这一点:)

您可以在数组
a
使用
numpy.nonzero时获得索引

>>> a = np.array([1, 0, 1, 0, 1, 1, 1, 0, 0])
>>> idx_nonzero, = np.nonzero(a)
>>> 
>>> idx_nonzero
array([0, 2, 4, 5, 6])
然后用
numpy.random.choice
选择其中一个值

>>> np.random.choice(idx_nonzero)
5

您可以首先生成索引列表,这些索引具有:

my_idcs = np.where(my_array)[0]
然后您可以随机获得其中一个索引,例如使用
random。选择

from random import choice

my_idx = choice(np.where(my_array)[0])
因此,这将返回一个索引,其中相应的值
my\u array[my\u idx]
1


请注意,如果
myu数组中没有
1
s,那么这将产生一个
索引器

哇,python太棒了。非常感谢你!非常感谢你!就效率而言,与@timgeb的解决方案相比:是其中一个更快,还是后面执行的代码几乎相同?是的,
np。其中带一个参数的
相当于
np。非零
。我从不喜欢
np.where的那种功能。我宁愿将此项删除并
np.where
重命名为
np.ifthenels
:)@Sh4nnon先生:通常情况下,时间上的差异会非常小,因为本质上两者都在运行相同的算法。我同意timgeb的观点,
np.where
是一个有点“草率”的术语,但这不是我发明的:)。非常感谢:)对不起,我不能给你们两个学分。