在条件下得到随机元素

时间:2018-06-11 13:08:21

标签: python numpy random

我有两个列表:图像和相应的标签。我希望通过给定标签获得随机图像。我想过使用numpy数组来获取布尔数组,然后使用list.index。问题是它返回第一次出现的指数。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用numpy.where获取包含条件为真的索引的数组,然后使用numpy.random.choice随机选择一个:

import numpy as np
# to always get the same result
np.random.seed(42)

# setup data
images = np.arange(10)
labels = np.arange(10)

# select on the labels
indices = np.where(labels % 2 == 0)[0]
print(indices)
# [0, 2, 4, 6, 8]

# choose one
random_image = images[np.random.choice(indices)]
print(random_image)
# 6

你可能想把它放在一个函数中:

from numpy import where
from numpy.random import choice

def random_img_with_label(images, labels, label):
    indices = where(labels == label)[0]
    return images[choice(indices)]

答案 1 :(得分:0)

有一种,也是唯一一种明显的方法可以做到这一点;那就是使用random.choice。 Here's a link to the documentation.

如果您要将过滤器应用于数据集,则可以考虑使用列表推导。

这就是我的意思:

import random

image_list = [ "image0"
             , "image1"
             , "image2"
             , "image3"
             , "image4"
             , "image5"
             , "image6"
             ]

label_list = [ "labelA"
             , "labelB"
             , "labelC"
             , "labelA"
             , "labelB"
             , "labelC"
             , "labelA"
             ]

print random.choice([img for (img, lbl) in zip(image_list, label_list) if lbl == "labelA"])

使用标准库的列表和理解比“滚动你自己的”随机选择器更加pythonic。

答案 2 :(得分:0)

是否有某些原因导致您无法使用random功能? 即

>>> import random
>>> labels=['label 1','label 2','label 3','label 4']
>>> images=['image1.png','image2.png','image3.png','image4.png','image5.png','image6.png']
>>> for i in labels: print(random.choice(images))
... 
image2.png
image4.png
image3.png
image3.png
>>>