2014-09-03 4 views
0

J'ai un tableau numpy avec rank = 4. Supposons qu'il ressemble à ceci:Tableaux multidimensionnels Numpy et accès inversé

np.shape(my_array) 
(10,5,25,50) 

J'ai aussi une liste de 10 valeurs, telles que

x = np.arange(10) 

Je voudrais être en mesure de tracer x contre le premier axe de my_array pour chaque valeur, qui est, je voudrais faire:

for axis2_index in xrange(5): 
    for axis3_index in xrange(25): 
     for axis4_index in xrange(50): 
      plt.plot(x,my_array[:,axis2_index,axis3_index,axis4_index]) 

Mais bien sûr, je veux le faire sous une forme numpy, sans for boucles. Cela fait longtemps que je me bats avec ça, mais je n'arrive toujours pas à trouver un moyen facile de le faire.

En d'autres termes, je voudrais pouvoir accéder au my_array pour obtenir, par exemple, une matrice de vecteurs 5x25x50 de 10 chacun, correspondant au premier axe my_array. J'ai aussi essayé np.reshape, mais cela change l'ordre des éléments de telle sorte que je ne peux pas l'utiliser.

+0

N'est-ce pas un très grand nombre de lignes? Dans ce cas, ce n'est pas la vitesse des for-loops dont vous avez besoin, mais la vitesse de rendu. Cependant, je vous suggère de regarder 'np.broadcast_arrays'. – mdurant

+0

Merci @mdurant. Ceci est juste un exemple, et je voudrais réellement faire quelques calculs et accéder à tous ces nombres: ils sont le résultat du calcul d'une fonction sur une grille de 3 paramètres différents, et la dimension supplémentaire est la sortie de la fonction, qui lui-même est un tableau (un spectre). J'ai vérifié 'np.broadcast_arrays', mais je n'arrive toujours pas à voir comment je pourrais utiliser ça ... un tutoriel avec un cas similaire que je pourrais regarder? le doc numpy ne me suffisait pas pour voir comment le faire. –

Répondre

0

Voici un exemple simple en utilisant la diffusion:

y = randn(10,4) 
x = arange(10) 

plot(x[:,None],y) 

Je suppose que dans votre cas, vous auriez x[:,None,None,None].

+0

C'était ma tentative initiale quand vous avez mentionné la diffusion, mais l'erreur suivante sort 'ValueError: x et y ne peuvent pas être plus grands que 2-D'. –

+0

Désolé, vous avez raison - je vous recontacterai. Vous devrez remodeler en 2d: la première dimension l'axe indépendant, et le reste pour tous les autres paramètres. – mdurant

+0

J'ai réussi à y accéder via une commande complexe: 'my_array.transpose(). Reshape (5 * 25 * 50,10)', puis tracez simplement chaque élément de celui-ci contre 'x'. Mais cela perd l'information sur les valeurs de coordonnées (param1, param2, et param3) pour chaque modèle je pense, donc pas vraiment très utile ... –