Aplica bincount a cada fila de una matriz numpy 2D

¿Hay una manera de aplicar bincount con “axis = 1”? El resultado deseado sería el mismo que la comprensión de la lista:

 import numpy as np A = np.array([[1,0],[0,0]]) np.array([np.bincount(r,minlength = np.max(A) + 1) for r in A]) #array([[1,1] # [2,0]]) 

np.bincount no funciona con una matriz 2D a lo largo de un eje determinado. Para obtener el efecto deseado con una sola llamada vectorizada a np.bincount , uno puede crear una matriz 1D de ID de tal manera que diferentes filas tengan diferentes ID, incluso si los elementos son los mismos. Esto mantendría a los elementos de diferentes filas que no se agrupan cuando se usa una sola llamada a np.bincount con esos ID. Por lo tanto, tal matriz de ID podría crearse con una idea de linear indexing en mente, como así:

 N = A.max()+1 id = A + (N*np.arange(A.shape[0]))[:,None] 

Luego, alimente los ID a np.bincount y finalmente np.bincount forma a 2D –

 np.bincount(id.ravel(),minlength=N*A.shape[0]).reshape(-1,N) 

Si los datos son demasiado grandes para que esto sea eficiente, es más probable que el problema sea el uso de memoria de la matriz densa en lugar de las operaciones numéricas en sí mismas. Este es un ejemplo del uso de un Sklearn Hashing Vectorizer en una matriz que es demasiado grande para usar el método de bincounts (los resultados son una matriz dispersa):

 import numpy as np from sklearn.feature_extraction.text import HashingVectorizer h = HashingVectorizer() A = np.random.randint(100,size=(1000,100))*10000 A_str = [" ".join([str(v) for v in i]) for i in A] %timeit h.fit_transform(A_str) #10 loops, best of 3: 110 ms per loop 

Puedes usar apply_along_axis , aquí hay un ejemplo

 import numpy as np test_array = np.array([[0, 0, 1], [0, 0, 1]]) print(test_array) np.apply_along_axis(np.bincount, axis=1, arr= test_array, minlength = np.max(test_array) +1) 

Tenga en cuenta que la forma final de esta matriz depende del número de contenedores, también puede especificar otros argumentos junto con apply_along_axis