Случайный.выборка(население, X) иногда не содержится в случайном.выборка(население, Y), когда Y>XPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Случайный.выборка(население, X) иногда не содержится в случайном.выборка(население, Y), когда Y>X

Сообщение Anonymous »

Я использую этот скрипт для выборки из списка файлов в каталоге и использую вызов с начальным значением random.sample(population, k).
Я ожидаю, что выборка 100 элементов с k=100 при использовании начального числа гарантирует, что при последующей выборке с k=800 100 выбранных элементов гарантированно попадут в список из 800 выбранных элементов. .
Однако после запуска этого скрипта в некоторых каталогах я получаю неоднозначные результаты. Иногда 100 находятся в пределах 800, но иногда есть различия для нескольких файлов, некоторые находятся здесь, а не там, и наоборот.
Есть ли какие-либо источники случайности, о которых я не знаю из?
Я попробовал отсортировать вызов os.listdir(), но это ничего не изменило. Я знаю, что могу реорганизовать сценарий, чтобы он работал, сначала выбрав большее значение и нарезав список образцов, но я ожидаю, что мой исходный сценарий будет работать таким же образом.
# script to sample from extracted frames from folders

import os
import random
import shutil
import argparse

def get_jpg_files(directory, ext="jpg"):
"""Get a list of all JPG files in a directory."""
dir_files = [f for f in os.listdir(directory)]
if ext:
dir_files = list(filter(lambda x: x.lower().endswith(f".{ext}"), dir_files))
print(f"Dir: {directory} - {len(dir_files)} files)")
return dir_files

def select_random_files(file_list, num_files, seed):
"""Randomly select a specified number of files from a list using a seed."""
random.seed(seed)
if num_files == -1:
num_files = len(file_list)
return random.sample(file_list, min(num_files, len(file_list)))

def copy_files(files, source_directory, destination_directory):
"""Copy selected files to the destination directory."""
if not os.path.exists(destination_directory):
os.makedirs(destination_directory)
for file in files:
shutil.copy(os.path.join(source_directory, file), destination_directory)

def main():

parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input", help="Input dir", type=str)
parser.add_argument("-o", "--output",help="Output dir", type=str)
parser.add_argument("-n", "--num_files", help="Number of files to copy", type=int)
parser.add_argument("-e", "--ext", help="Copy only files with this extension", type=str, default=None)
args = parser.parse_args()

input_dir = args.input
output_dir = args.output
os.makedirs(output_dir, exist_ok=True)

SEED = 42

jpg_files = get_jpg_files(input_dir, ext=args.ext)
with open(f"/home/ik/shares/aiconstruction_workspace/TEST_SAMPLE/dir_files_{input_dir.split('/')[-1]}_{args.num_files}.txt", "w") as f:
f.write("\n".join(jpg_files))
selected_files = select_random_files(jpg_files, args.num_files, seed=SEED)
print(f"Selected files are: {selected_files}")
with open(f"/home/ik/shares/aiconstruction_workspace/TEST_SAMPLE/frames_{input_dir.split('/')[-1]}_{args.num_files}.txt", "w") as f:
f.write("\n".join(selected_files))
# copy_files(selected_files, input_dir, output_dir)
# print(f"Selected files from {input_dir}: {selected_files}")

if __name__ == "__main__":
main()


Подробнее здесь: https://stackoverflow.com/questions/788 ... population
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»