Я использую этот скрипт для выборки из списка файлов в каталоге и использую вызов с начальным значением 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
Случайный.выборка(население, X) иногда не содержится в случайном.выборка(население, Y), когда Y>X ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение