2010-03-01 3 views
23

Sûrement il doit y avoir un moyen de le faire ... Je ne peux pas le résoudre.numpy: étendre des tableaux le long d'un nouvel axe?

J'ai un tableau (9,4), et je veux le répéter le long d'un 3ème axe 4096 fois ... Donc il devient simplement (9,4,4096), avec chaque valeur du tableau 9,4 simplement répété 4096 fois sur le nouvel axe.

Si mon schéma douteux 3D est logique (la diagonale est un axe z)

4| /off to 4096 
3|/
2|/
1|/_ _ _ _ _ _ _ _ _ 
    1 2 3 4 5 6 7 8 9 

Vive

EDIT: Juste pour clarifier, l'accent est mis sur le tableau (9,4) étant répété pour chacune des 4096 'lignes' du nouvel axe. Imaginez une section transversale - chaque tableau original (9,4) est l'un de ceux qui se trouvent sur le long cuboïde 4096.

+0

'np.tile' est une autre option. Voir les réponses à [cette question] (http://stackoverflow.com/q/1721802/2623899). – dbliss

+0

Aussi vous avez dessiné le diagramme pour 4 par 9 matrice. :) –

Répondre

22

Voici une façon:

import scipy 
X = scipy.rand(9,4,1) 
Y = X.repeat(4096,2) 

Si X vous est donné comme seul (9,4), puis

import scipy 
X = scipy.rand(9,4) 
Y = X.reshape(9,4,1).repeat(4096,2) 
+1

Merci encore Steve, devenait confus parce que je n'avais pas réalisé que vous deviez remodeler le tableau avant d'utiliser la méthode repeat - il me répétait que j'essayais d'utiliser un axe qui n'était pas défini. Donne du sens si maintenant. –

9

Vous pouvez également compter sur les règles de radiodiffusion à répéter le remplissage un redimensionnée tableau:

import numpy 
X = numpy.random.rand(9,4) 
Y = numpy.resize(X,(4096,9,4)) 

Si vous ne voulez pas les axes commandés de cette façon, vous pouvez transposer:

Z = Y.transpose(1,2,0) 
5

question est super vieux, mais voici une autre option de toute façon:

import numpy as np 
X = np.random.rand(9,4) 
Y = np.dstack([X] * 4096) 
+0

Au lieu de '[X for i in range (4096)]' vous pouvez simplement faire [X] * 4096'. – blubberdiblub

+0

Bon appel, édité ma réponse. – DavidS