Generar una matriz booleana 2D a partir de tuplas

¿Cómo puedo generar una matriz booleana 2D utilizando una lista de tuplas que muestra los índices de los valores verdaderos?

Por ejemplo tengo la siguiente lista de tuplas:

lst = [(0,1), (0, 2), (1, 0), (1, 3), (2,1)] 

Lo que hago es, primero genero una matriz de Falso:

 arr = np.repeat(False, 12).reshape(3, 4) 

Luego, itere sobre la lista para asignar valores verdaderos:

 for tup in lst: arr[tup] = True print(arr) array([[False, True, True, False], [ True, False, False, True], [False, True, False, False]], dtype=bool) 

Me parece un caso de uso común, así que me preguntaba si hay un método incorporado para esto, sin los bucles.

zip(*...) es una forma práctica de “transponer” una lista de listas (o tuplas). Y A[x,y] es lo mismo que A[(x,y)] .

 In [397]: lst = [(0,1), (0, 2), (1, 0), (1, 3), (2,1)] In [398]: tuple(zip(*lst)) # make a tuple of tuples (or lists) Out[398]: ((0, 0, 1, 1, 2), (1, 2, 0, 3, 1)) In [399]: A=np.zeros((3,4),dtype=bool) # make an array of False In [400]: A[tuple(zip(*lst))] = True # assign True to the 5 values In [401]: A Out[401]: array([[False, True, True, False], [ True, False, False, True], [False, True, False, False]], dtype=bool) 

Puedes usar indexación multidimensional para esto:

 >>> lst = np.array(lst) >>> arr = np.repeat(False, 12).reshape(3, 4) >>> arr[lst[:,0], lst[:,1]] = True >>> arr array([[False, True, True, False], [ True, False, False, True], [False, True, False, False]], dtype=bool) 

Este es un enfoque que utiliza NumPy's linear indexing que funciona para tuplas de cualquier longitud destinada a generar arreglos multidimensionales:

 # Convert list of indices to a 2D array version idx = np.array(lst) # Decide on the shape of output array based on the extents, then initialize shp = idx.max(0)+1 out = np.zeros(shp,dtype=bool) # Using np.put insert 1s in out at places specified by linear indices version np.put(out,np.ravel_multi_index(idx.T,shp),1) 

Muestra de entrada, salida –

 In [54]: lst Out[54]: [(0, 1, 3), (0, 2, 2), (1, 0, 0), (1, 3, 1), (2, 1, 3)] In [55]: out Out[55]: array([[[False, False, False, False], [False, False, False, True], [False, False, True, False], [False, False, False, False]], [[ True, False, False, False], [False, False, False, False], [False, False, False, False], [False, True, False, False]], [[False, False, False, False], [False, False, False, True], [False, False, False, False], [False, False, False, False]]], dtype=bool)