2017-09-28 5 views
-2

J'essaie de concaténer des tableaux 2D horizontalement en utilisant numpy de manière dynamique. A partir d'un tableau vide, je veux ajouter des tableaux 2D en fonction du résultat de la condition if. Je ne connais pas la dimension finale, donc je ne peux rien définir avant le début de la boucle. En supposant que j'ai les tableaux 2D appelés A, B, C:Comment concaténer des tableaux 2D à la volée en Python?

X = np.array([]) 
for name in modules: 
    if name = 'AAA': 
     X = np.append(X,A, axis = 1) 
    if name = 'BBB' 
     X = np.append(X,B, axis = 1) 
    if name = 'CCC' 
     X = np.append(X,C, axis = 1) 

Après avoir lu comment fonctionne np.append je compris pourquoi cette solution est fausse. Existe-t-il un moyen facile de produire une concaténation à la volée? N: B: Je connais le nombre de colonnes et de rangées de A, B, C (ils ont le même nombre de rangées) mais je ne peux pas savoir combien de matrices seront concaténées puisque tout dépend des conditions if. L'ordre de concaténation est important et devrait être comme indiqué dans le code.

+1

Collectez les tableaux dans une liste et faites un 'np.concatenate' à la fin. – hpaulj

Répondre

1

Parce que d'abord, X n'a pas le même nombre de lignes que A, B ou C, vous ne pouvez pas ajouter X avec aucun d'entre eux. Voici un petit tweak:

X = None 
for name in modules: 
    if name = 'AAA': 
     X = np.append(X,A, axis = 1) if X is not None else A 
    if name = 'BBB' 
     X = np.append(X,B, axis = 1) if X is not None else B 
    if name = 'CCC' 
     X = np.append(X,C, axis = 1) if X is not None else C 

Espérons que cela serait utile.

+0

Cela fonctionne. Je vous remercie!! – Alex

2

Vous pouvez créer un dictionnaire qui fonctionne comme une table de correspondance, en faisant correspondre les noms avec les tableaux.

mapper = {'AAA': A, 
      'BBB': B, 
      'CCC': C} 

X = np.hstack([mapper[name] for name in modules]) 
+1

Il veut 'hstack' ou' concatenate' avec 'axis = 1'. À part ça, c'est une solution plus propre. – hpaulj

+0

Vous avez raison, je l'ai changé. –