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])