Если у вас есть 4 списка A, B, C и D, которые содержат объекты определенной длины, например, список A имеет элементы n_a и все элементы имеют ширину 1, список B содержит элементы n_b, и все элементы имеют ширину 2, список C имеет элементы n_c, и все элементы имеют ширину 3, а список D имеет n_d< /code>, и все элементы имеют ширину 4. Цель состоит в том, чтобы создать массив, элементы которого случайным образом выбираются из A, B, C и D в соответствии с определенным пользователем распределением вероятностей, например {1: 0,25, 2: 0,25, 3:0,5, 4:0,0}. Например, при распределении = {1: 0,25, 2: 0,25, 3: 0,5, 4: 0,0} выходная сетка должна давать случайные элементы примерно с 25% элементов шириной 1 из списка A, 25% элементов шириной 2 из списка. B и 50% элементов шириной 3 из списка C, при этом запрещая элементы шириной 4.
Вот как я случайным образом выбираю элементы из всех четырех списков:
Код: Выделить всё
import numpy as np
import random
A = [1, 2, 3]
B = ['aa', 'bb', 'cc']
C = [111, 222, 333]
D = ['aaaa', 'bbbbb', 'cccc']
num_of_rows = 4 # no. of rows in the final grid
num_of_coulmns = 5 # no. of columns in the final grid
# Define the probabilities
p_A = 0.25
p_B = 0.25
p_C = 0.5
p_D = 0.0
probabilities = [p_A, p_B, p_C, p_D]
# Create the random length array by sampling from the lists
result_array = []
for _ in range(num_of_rows):
# Choose a list based on the probabilities
chosen_list = random.choices([A, B, C, D], weights=probabilities, k=1)[0]
# Sample a random element from the chosen list
element = random.choice(chosen_list)
# Append the element to the result array
result_array.append(element)
Но этот метод будет слишком неэффективен для больших значений строк и столбцов сетки (например, 1000). Есть ли лучший способ добиться этого?
Подробнее здесь:
https://stackoverflow.com/questions/785 ... m-sampling