obtain ndarray index array python indexing numpy

python - ndarray - numpy where



Incrementar la matriz Numpy con índices repetidos (4)

Por qué no?

for i in b: a[i] += 1

Tengo una matriz Numpy y una lista de índices cuyos valores me gustaría incrementar en uno. Esta lista puede contener índices repetidos, y me gustaría que el incremento se escale con el número de repeticiones de cada índice. Sin repeticiones, el comando es simple:

a=np.zeros(6).astype(''int'') b=[3,2,5] a[b]+=1

Con repeticiones, he encontrado el siguiente método.

b=[3,2,5,2] # indices to increment by one each replicate bbins=np.bincount(b) b.sort() # sort b because bincount is sorted incr=bbins[np.nonzero(bbins)] # create increment array bu=np.unique(b) # sorted, unique indices (len(bu)=len(incr)) a[bu]+=incr

Es esta la mejor manera? ¿Existe np.bincount riesgo al suponer que las operaciones np.bincount y np.unique np.bincount como resultado el mismo orden ordenado? ¿Me estoy perdiendo alguna operación simple de Numpy para resolver esto?


Después de que lo hagas

bbins=np.bincount(b)

por qué no hacer:

a[:len(bbins)] += bbins

(Editado para una mayor simplificación).


Si b es un subrango pequeño de a , uno puede refinar la respuesta de Alok así:

import numpy as np a = np.zeros( 100000, int ) b = np.array( [99999, 99997, 99999] ) blo, bhi = b.min(), b.max() bbins = np.bincount( b - blo ) a[blo:bhi+1] += bbins print a[blo:bhi+1] # 1 0 2


En numpy> = 1.8, también puede usar el método at de la adición ''universal function'' (''ufunc''). Como la nota de los documentos :

Para agregar ufunc, este método es equivalente a [índices] + = b, excepto que los resultados se acumulan para elementos que están indexados más de una vez.

Entonces tomando su ejemplo:

a = np.zeros(6).astype(''int'') b = [3, 2, 5, 2]

…para entonces…

np.add.at(a, b, 1)

... dejará a como ...

array([0, 0, 2, 1, 0, 1])