Dato N matrici non confrontabili di diverse dimensioni, qual è il metodo migliore per combinarle in un unico array di output?
Poiché gli array di input non sono confrontabili, è necessaria una metrica per rappresentare la frequenza con cui il valore in cima alla matrice in questione viene aggiunto all'array di output. Chiamiamo weight
e lascia che sia un valore arbitrario da 1
a 10
.
Ecco un esempio di serie di dati con pesi:
numbers = [1, 2, 3, 4, 5]
numbers_weight = 3
books = ['The Lord of the Rings',
'The Hitchhikers Guide to the Galaxy',
'Enders Game',
'1984']
books_weight = 5
words = ['polar', 'fiendish', 'percussive']
words_weight = 10
Una soluzione ingenua potrebbe generare un numero casuale e quindi chiedere ad ogni array se passa o fallisce in base al suo peso. Se passa, aggiungilo alla fine della matrice di output. Quindi genera un nuovo numero casuale e ricomincia da capo fino a quando non viene raggiunto un limite massimo.
Ecco la soluzione ingenua che agisce sui dati di esempio:
def join_arrays(arrays, weights, weight_min, weight_max, output_limit):
output = []
while True:
rnd = random.randint(weight_min, weight_max)
for i in range(len(arrays)):
if rnd <= weights[i] and len(arrays[i]) > 0:
output.append(arrays[i].pop(0))
if len(output) >= output_limit:
return output
Ed ecco come viene chiamata la funzione, usando ancora i dati di esempio:
arrays = [numbers, books, words]
weights = [numbers_weight, books_weight, words_weight]
random.seed(time.time())
output = join_arrays(arrays, weights, 1, 10, 6)
Il problema che ho con questo tipo di implementazione in stile round robin è che se la dimensione di arrays
è enormemente maggiore di output_limit
, quelli verso il retro di arrays
appariranno meno frequentemente di quanto il loro peso sarebbe suggerire, o non farlo affatto, perché ci saranno casi in cui semplicemente non è stato chiesto se passano, e quindi non aggiunti a output
.
C'è una soluzione a questo problema che consente a tutti gli array di input all'interno di arrays
di essere chiesti se passano o falliscono, quindi sono equi, pur consentendo una output_limit
?
L'uso di pesi è appropriato anche per questo tipo di combinazione?