Python numpy数组中非零值的随机索引
我希望以前没有人问过这个问题。我不知道该如何重新表述这个问题。这是非常相似的,但仍然不完全是我要找的 我有一个长度可变的numpy数组(介于4-12之间)。数组的值为0或1。我想从数组中获取随机样本的索引,它不是0 我的想法是这样做: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
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
是一个有点“草率”的术语,但这不是我发明的:)。非常感谢:)对不起,我不能给你们两个学分。