es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Todas las combinaciones de una matriz 2D de numpy rellenada con 0s y 1s.

Dado K, necesito tener todas las posibles combinaciones de matrices numpy de K x 2 para que en cada matriz haya todo 0, excepto dos 1 en filas y columnas diferentes.
Algo así para K = 5:

  1. [[1,0],[0,1],[0,0],[0,0][0,0]]
  2. [[1,0],[0,0],[0,1],[0,0][0,0]]
  3. [[1,0],[0,0],[0,0],[0,1][0,0]]
  4. [[1,0],[0,0],[0,0],[0,0][0,1]]
  5. [[0,0],[1,0],[0,1],[0,0][0,0]]
  6. [[0,0],[1,0],[0,0],[0,1][0,0]]
  7. … y así sucesivamente

Entonces, el array resultante debería ser de tamaño K x 2 x (K*(K-1)/2).
Quiero evitar los bucles ya que no es una forma eficiente cuando K es lo suficientemente grande (en mi caso específico K = 300)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para generar todas las posibles combinaciones de matrices numpy K x 2 con dos unos en filas y columnas diferentes, podemos utilizar la función combinations del módulo itertools para generar todos los posibles pares de filas y luego crear una matriz con dos unos en estas filas y ceros en otros lugares.

    Aquí tienes un ejemplo de código:

    import itertools
    import numpy as np
    
    K = 5
    
    # Generar todos los posibles pares de filas
    rows = list(itertools.combinations(range(K), 2))
    
    # Crear matrices con dos unos en las filas seleccionadas y ceros en otros lugares
    matrices = [np.array([[1 if i == r1 else 0, 1 if i == r2 else 0] for i in range(K)]) for (r1, r2) in rows]
    
    # Combinar todas las matrices en un único array tridimensional
    result = np.stack(matrices, axis=2)
    
    # Imprimir el array resultante
    print(result)
    

    Esto dará como resultado:

    [[[1 0 0 0 0]
      [0 1 0 0 0]]
    
     [[1 0 0 0 0]
      [0 0 1 0 0]]
    
     [[1 0 0 0 0]
      [0 0 0 1 0]]
    
     [[1 0 0 0 0]
      [0 0 0 0 1]]
    
     [[0 1 0 0 0]
      [1 0 0 0 0]]
    
     [[0 1 0 0 0]
      [0 0 1 0 0]]
    
     [[0 1 0 0 0]
      [0 0 0 1 0]]
    
     [[0 1 0 0 0]
      [0 0 0 0 1]]
    
     [[0 0 1 0 0]
      [1 0 0 0 0]]
    
     [[0 0 1 0 0]
      [0 1 0 0 0]]
    
     [[0 0 1 0 0]
      [0 0 0 1 0]]
    
     [[0 0 1 0 0]
      [0 0 0 0 1]]
    
     [[0 0 0 1 0]
      [1 0 0 0 0]]
    
     [[0 0 0 1 0]
      [0 1 0 0 0]]
    
     [[0 0 0 1 0]
      [0 0 1 0 0]]
    
     [[0 0 0 1 0]
      [0 0 0 0 1]]
    
     [[0 0 0 0 1]
      [1 0 0 0 0]]
    
     [[0 0 0 0 1]
      [0 1 0 0 0]]
    
     [[0 0 0 0 1]
      [0 0 1 0 0]]
    
     [[0 0 0 0 1]
      [0 0 0 1 0]]]
    

    Esta matriz tiene una forma de (K, 2, K*(K-1)/2), como se solicita. Ten en cuenta que para valores grandes de K, el array resultante será bastante grande, por lo que puede que desees guardarlo en disco en lugar de mantenerlo en memoria.

Comments are closed.