web-dev-qa-db-fra.com

incompatibilité de forme: les tableaux d'indexation n'ont pas pu être diffusés avec les formes

j=np.arange(20,dtype=np.int)
site=np.ones((20,200),dtype=np.int)
sumkma=np.ones((100,20))

[sumkma[site[x],x] for x in range(20)]

Cela fonctionne, mais je ne veux pas utiliser de boucle. Quand j'essaye

sumkma[site[j],j]

Je reçois cette erreur:

IndexError: incompatibilité de forme: les tableaux d'indexation n'ont pas pu être diffusés avec les formes (20 200) (20,)

Comment corriger l'erreur?

10
kinder chen

Lors de l'accès à un tableau multidimensionnel numpy avec d'autres tableaux multidimensionnels de type entier, les tableaux utilisés pour les indices doivent avoir la même forme.

Numpy diffusera avec plaisir, si possible - mais pour que cela soit possible, les tableaux doivent avoir la même dimensionnalité , par ex. cela marche:

sumkma[site[j], j[:,np.newaxis]]

Le np.newaxis résulte en j[:,np.newaxis] étant bidimensionnel (la forme est maintenant (20,1), tandis que la forme de j est unidimensionnelle (20,)). Il a maintenant une forme qui peut être diffusée sous la forme de site[j]:

>>> j.shape
(20,)
>>> site[j].shape
(20,200)
>>> j[:,np.newaxis].shape
(20,1)

La même dimensionnalité pour les tableaux d'index permet à numpy de les diffuser pour avoir la même forme (20,200).

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html#indexing-multi-dimensional-arrays

8
tmbo