Matriz numpy binario a la lista de enteros?

Tengo una matriz binaria, y me gustaría convertirla en una lista de enteros, donde cada int es una fila de la matriz.

Por ejemplo:

from numpy import * a = array([[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 1]]) 

Me gustaría convertir a a [12, 4, 7, 15] .

Una vez hice una pregunta similar aquí . Aquí estaba mi respuesta , adaptada a tu pregunta:

 def bool2int(x): y = 0 for i,j in enumerate(x): y += j< 

La respuesta de @ SteveTjoa está bien, pero para las patadas, aquí hay una frase de una sola persona:

 In [19]: a Out[19]: array([[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 1]]) In [20]: a.dot(1 << arange(a.shape[-1] - 1, -1, -1)) Out[20]: array([12, 4, 7, 15]) 

( numpy.arange is numpy.arange .)

Si los bits están en el orden opuesto, cambie el orden de los valores producidos por arange :

 In [25]: a.dot(1 << arange(a.shape[-1])) Out[25]: array([ 3, 2, 14, 15]) 

También puedes hacer esto dentro de numpy directamente:

 from numpy import * a = array([[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 1]]) b2i = 2**arange(a.shape[0]-1, -1, -1) result = (a*b2i).sum(axis=1) #[12 4 7 15] 

Si te gusta trabajar directamente con matemática bitwise, este debería funcionar bastante bien.

 def bits2int(a, axis=-1): return np.right_shift(np.packbits(a, axis=axis), 8 - a.shape[axis]).squeeze() bits2int(a) Out: array([12, 4, 7, 15], dtype=uint8) 

Otro:

 def row_bits2int(arr): n = arr.shape[1] # number of columns # shift the bits of the first column to the left by n - 1 a = arr[:, 0] << n - 1 for j in range(1, n): # "overlay" with the shifted bits of the next column a |= arr[:, j] << n - 1 - j return a