操作系统列表目录()根据条件从返回的列表中随机选择

2024-06-10 20:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个目录,包含来自三个不同域的数千个图像

假设文件名为xxx_A.png和yyy_B.png和zzz_C.png 每个领域都有成千上万的人

os.listdir()将返回目录中所有图像名的列表

然后我想根据一些百分比过滤这个列表

示例: 我指定我想要在这数千张图片中,只有100张经过洗牌的图片,其中30%来自domainA,30%来自domainB,40%来自domainC

所以只要给定一个特定的数字,我就有这些百分比,然后我选择x个随机图像(当然是基于图像名称,因为它们已经被指定了),这就是新列表

示例:

输入:

['1_A.png', '2_A.png', '3_A.png', '4_A.png', '5_A.png', '6_A.png', '7_A.png', '8_A.png', '9_A.png', '10_A.png', '1_B.png', '2_B.png', '3_B.png', '4_B.png', '5_B.png', '6_B.png', '7_B.png', '8_B.png', '9_B.png', '10_B.png', '1_C.png', '2_C.png', '3_C.png', '4_C.png', '5_C.png', '6_C.png', '7_C.png', '8_C.png', '9_C.png', '10_C.png']

我要12个图像,30%来自域A,30%来自域B,40%来自域C

输出:

^{pr2}$

我怎么做这个?在


Tags: 图像目录示例列表pngos文件名图片
3条回答

以下是一种可能的方法:

  1. 首先根据字母使用^{}将所有文件名拆分为域。e、 像字典一样:

    {'A' : ['file1_A.jpg', 'file2_A.jpg'], 'B' : ['file1_B.jpg']}
    
  2. 对于每个域,使用^{}从域中随机抽取所需数量的文件到输出列表中。^{}用于通过始终向上舍入来确保始终存在足够的文件。

  3. 最后,洗牌组合输出列表(如果需要),并确保文件总数正确。

这将产生一个输出,其中包含来自每个域的随机元素的精确分布。在

^{pr2}$

给出可能的输出:

12 ['6_B.png', '2_B.png', '3_B.png', '10_A.png', '1_A.png', '6_A.png', '2_C.png', '1_B.png', '1_C.png', '3_C.png', '2_A.png', '10_C.png']    

在python3.6.6上测试

下面是我定义的一个函数。正如马丁所说,数学.ceil可能是用于获取文件数量的最佳函数(这样您就不会得到少于所需数量的文件)。另外,您将希望在没有替换的情况下进行采样(这意味着您不希望重复文件名),因此不应使用随机选择就像Rakesh做的那样随机选择更换样品)。这个随机洗牌避免了这个问题。在

输入:

import random
import math
os_dir_list= ['1_A.png', '2_A.png', '3_A.png', '4_A.png', '5_A.png', '6_A.png', '7_A.png', '8_A.png', '9_A.png', '10_A.png', '1_B.png', '2_B.png', '3_B.png', '4_B.png', '5_B.png', '6_B.png', '7_B.png', '8_B.png', '9_B.png', '10_B.png', '1_C.png', '2_C.png', '3_C.png', '4_C.png', '5_C.png', '6_C.png', '7_C.png', '8_C.png', '9_C.png', '10_C.png']       
def shuffle_pick(os_dir_list,length, tuple_list):
    shuffled_list = []
    for letter,percent in tuple_list:
        sub_list = [img for img in os_dir_list if img.endswith(letter + '.png')]
        random.shuffle(sub_list)
        num = int(math.ceil(len(sub_list)*percent/100))
        shuffled_list += sub_list[:num]
    return shuffled_list[:length]

print(shuffle_pick(os_dir_list, 12, [('A',30),('B',30),('C',60)]))

输出:

^{pr2}$

您还可以在return语句之前调用random.shuffle(shuffled_list)来洗牌输出列表。在

这是一种方法。我用一个字典从不同的域分离图像,然后计算每个域所需的图像数。在

演示:

import random    

inputData = ['1_A.png', '2_A.png', '3_A.png', '4_A.png', '5_A.png', '6_A.png', '7_A.png', '8_A.png', '9_A.png', '10_A.png', '1_B.png', '2_B.png', '3_B.png', '4_B.png', '5_B.png', '6_B.png', '7_B.png', '8_B.png', '9_B.png', '10_B.png', '1_C.png', '2_C.png', '3_C.png', '4_C.png', '5_C.png', '6_C.png', '7_C.png', '8_C.png', '9_C.png', '10_C.png']

d = {"A": [], "B":[], "C":[]}
#for i in os.listdir("path"):
for i in inputData:           #Group images by domain. 
    if "A" in i:
        d["A"].append(i)
    elif "B" in i:
        d["B"].append(i)
    else:
        d["C"].append(i)

percentage = {"A": 30, "B": 30, "C": 60} 

res = []
for k, v in d.items():
    res.extend([random.choice(v) for i in range(int((percentage[k] * len(v)) / 100.0))])
print(res) 

输出:

^{pr2}$

相关问题 更多 >