Supposons que j'ai;
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays
J'essaye de me convertir;
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5])
Je résous le problème par itération sur vstack en ce moment, mais c'est vraiment lent pour les listes particulièrement volumineuses
Que proposez-vous pour la meilleure manière efficace?
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])]
ce n'est pas la bonne syntaxe python. Précisez s'il vous plaît.Réponses:
En général, vous pouvez concaténer toute une séquence de tableaux le long de n'importe quel axe:
mais vous ne devez vous soucier de la forme et dimensionnalité de chaque tableau dans la liste (pour 2 dimensions sortie 3x5, vous devez vous assurer qu'ils sont tous les n-par-5 tableaux déjà 2 dimensions). Si vous souhaitez concaténer des tableaux à une dimension en tant que lignes d'une sortie à deux dimensions, vous devez étendre leur dimensionnalité.
Comme le souligne la réponse de Jorge, il y a aussi la fonction
stack
, introduite dans numpy 1.10:Cela prend l'approche complémentaire: il crée une nouvelle vue de chaque tableau d'entrée et ajoute une dimension supplémentaire (dans ce cas, sur la gauche, chaque
n
tableau -element 1D devient un tableau 1 parn
2D) avant la concaténation. Cela ne fonctionnera que si tous les tableaux d'entrée ont la même forme, même le long de l'axe de concaténation.vstack
(ou de manière équivalenterow_stack
) est souvent une solution plus facile à utiliser car elle prendra une séquence de tableaux à 1 et / ou 2 dimensions et étendra la dimensionnalité automatiquement si nécessaire et uniquement si nécessaire, avant de concaténer la liste entière. Lorsqu'une nouvelle dimension est requise, elle est ajoutée à gauche. Encore une fois, vous pouvez concaténer une liste entière à la fois sans avoir à itérer:Ce comportement flexible est également présenté par le raccourci syntaxique
numpy.r_[ array1, ...., arrayN ]
(notez les crochets). C'est bon pour concaténer quelques tableaux nommés explicitement mais ce n'est pas bon pour votre situation car cette syntaxe n'acceptera pas une séquence de tableaux, comme la vôtreLIST
.Il existe également une fonction
column_stack
et un raccourci analoguesc_[...]
, pour l'empilement horizontal (par colonne), ainsi qu'une fonction presque analogiquehstack
- bien que, pour une raison quelconque, cette dernière soit moins flexible (elle est plus stricte sur la dimensionnalité des tableaux d'entrée et tente de concaténer Tableaux 1-D de bout en bout au lieu de les traiter comme des colonnes).Enfin, dans le cas spécifique de l'empilement vertical de tableaux 1-D, ce qui suit fonctionne également:
... parce que les tableaux peuvent être construits à partir d'une séquence d'autres tableaux, ajoutant une nouvelle dimension au début.
la source
À partir de la version 1.10 de NumPy, nous avons la pile de méthodes . Il peut empiler des tableaux de n'importe quelle dimension (tous égaux):
Prendre plaisir,
la source
J'ai vérifié certaines des méthodes pour les performances de vitesse et je trouve qu'il n'y a pas de différence! La seule différence est qu'en utilisant certaines méthodes, vous devez vérifier soigneusement la dimension.
Horaire:
Comme vous pouvez le voir, j'ai essayé 2 expériences - en utilisant
np.random.rand(10000)
etnp.random.rand(1, 10000)
Et si nous utilisons des tableaux 2d quenp.stack
etnp.array
créons une dimension supplémentaire - result.shape est (1,10000,10000) et (10000,1,10000) donc ils ont besoin d'actions supplémentaires pour éviter cela .Code:
la source