Dividir al azar un vector en n contenedores de longitudes aleatorias -- python campo con performance camp codereview Relacionados El problema

Randomly split a vector into N bins of random lengths


4
vote

problema

Español

Como dice el título, quiero una función que toma un vector, así como el número de contenedores, y divide el vector en ese número de contenedores, con una longitud mínima de 1 para cada contenedor.

  def split_into_bins(nbin, vector):     """     Randomly split vector into nbin number of bins, each of random size      """     permutation = list(np.random.permutation(vector))      # Location of the splits     splits = sorted(np.random.choice(range(1,len(vector)), nbin-1, replace=False))      # Initializing empty bins     bins = [[]]*nbin      start = 0     end = splits[0]      for i in range(nbin):         bins[i] = permutation[start:end]         start = end         try:             end = splits[i+1]         except IndexError:             end = len(vector)      return bins   

Me pregunto si hay una forma más limpia de dividir el vector en los contenedores además de seleccionar aleatoriamente ubicaciones divididas. Mi método de dividir la lista dada la ubicación de las divisiones también parece bastante desordenada. El rendimiento importa, por lo que me pregunto si debería inicializar los contenedores vacíos fuera de la función.

Tampoco quiero que haya un sesgo con respecto al tamaño de los contenedores; Todos deberían tener el mismo tamaño en promedio. Sin embargo, estoy bastante seguro de que este método no está sesgado.

Original en ingles

As the title says, I want a function that takes a vector, as well as the number of bins, and splits the vector in that number of bins, with a minimum length of 1 for each bin.

def split_into_bins(nbin, vector):     """     Randomly split vector into nbin number of bins, each of random size      """     permutation = list(np.random.permutation(vector))      # Location of the splits     splits = sorted(np.random.choice(range(1,len(vector)), nbin-1, replace=False))      # Initializing empty bins     bins = [[]]*nbin      start = 0     end = splits[0]      for i in range(nbin):         bins[i] = permutation[start:end]         start = end         try:             end = splits[i+1]         except IndexError:             end = len(vector)      return bins 

I'm wondering if there's a cleaner way to split the vector into bins besides randomly selecting split locations. My method of splitting up the list given the location of the splits also seems pretty messy. Performance does matter, so I'm wondering if I should initialize the empty bins outside of the function.

I also don't want there to be any bias with regards to the size of the bins; they should all have the same size on average. I'm pretty sure this method isn't biased, however.

     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

if not list1: print("list is empty") elif ... 33 puede Simplemente tome un 99887766555443334 , para que pueda simplificar su código, sin necesidad de crear un 99887766655443335 :

  if not list1:     print("list is empty") elif ... 6  

Cuando acumule los contenedores, no necesita un 998877766555443337 (sabe por adelantado cuál es el tamaño). Solo necesitas iterar sobre las divisiones reales:

  if not list1:     print("list is empty") elif ... 8  
 

np.random.choice can just take an int, so that can simplify your code - no need to build up a range():

splits = sorted(1 + x      for x in np.random.choice(len(vector)-1, nbins-1, replace=True)) 

When you build up the bins, you don't need a try/except (you know up front what the size is). You just need to iterate over the actual splits:

bins = []  last = 0 for split in splits:     bins.append(permutation[last:split])     last = split bins.append(permutation[split:])  
 
 

Relacionados problema

3  Generador de imágenes de Mandelbrot con iteración paralela  ( Mandelbrot image generator with parallel iteration ) 
Actualmente estoy tratando de optimizar esta clase que tengo para la generación fractal. La ecuación está destinada a ser conectable; He usado z => z*z + c ...

8  Simple GCD Utility en Java  ( Simple gcd utility in java ) 
i anteriormente discutido El rendimiento se refiere a diferentes algoritmos GCD. Escribí una simple clase de Java que implementa el algoritmo binario GCD. E...

35  Demasiados bucles en la aplicación de dibujo  ( Too many loops in drawing app ) 
Tengo un método que tiene muchos bucles: #ifndef __RUNES_STRUCTURES_H #define __RUNES_STRUCTURES_H /* Runes structures. */ struct Game { char board[2...

5  Memoria / Performance of Merge Sort Code  ( Memory performance of merge sort code ) 
Escribí un código de tipo de combinación para un poco de bocadillo nocturno. Lo he puesto trabajando, pero solo estaba mirando a aprender si me faltaba algo e...

4  Simulación simple de red neural en C ++ (Ronda 2)  ( Simple neural network simulation in c round 2 ) 
Intro Ayer He publicado esta pregunta . Desde entonces, he actualizado mi código para incorporar estas sugerencias . También he eliminado la dependencia d...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

5  Encuentre el próximo número Prime - Control de flujo de los bucles anidados 'para `  ( Find the next prime number flow control of nested for loops ) 
Este código funciona perfectamente, pero me molesta. Tener un bucle etiquetado y anidado Bucle, con un Enumerable<T>.Empty()0 Declaración, y un 9988777665...

2  IMACROS BOT para realizar refrescos  ( Imacros bot for performing refreshes ) 
Estoy tratando de simplificar este código. Parece que todo funciona como debería; Sin embargo, cuando en el bucle de actualización de Imacro, parece un poco i...

1  Integración de oscilador de fase perturbada  ( Perturbed phase oscillator integration ) 
Estoy integrando un sistema de osciladores de fase perturbados. Defino el sistema de ecuación y también la matriz jacobiana. Tengo que remodelar el vector dim...

1  Compruebe si dos cadenas son permutación entre sí  ( Check if two strings are permutation of each other ) 
private String sort(String word) { char[] content = word.toCharArray(); Arrays.sort(content); return new String(content); } private boolea...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos