web-dev-qa-db-fra.com

Concaténez deux tableaux NumPy verticalement

J'ai essayé ce qui suit:

>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.concatenate((a,b), axis=0)
array([1, 2, 3, 4, 5, 6])
>>> np.concatenate((a,b), axis=1)
array([1, 2, 3, 4, 5, 6])

Cependant, je m'attendrais à ce qu'au moins un résultat ressemble à ceci

array([[1, 2, 3],
       [4, 5, 6]])

Pourquoi n'est-il pas concaténé verticalement?

61
toom

Parce que a et b n'ont qu'un seul axe, leur forme étant (3), et le paramètre axis fait spécifiquement référence à l'axe des éléments à concaténer.

cet exemple devrait clarifier ce que concatenate fait avec axis. Prendre deux vecteurs avec deux axes, de forme (2,3):

a = np.array([[1,5,9], [2,6,10]])
b = np.array([[3,7,11], [4,8,12]])

concatène le long du 1er axe (lignes du 1er, puis lignes du 2ème):

np.concatenate((a,b), axis=0)
array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])

concatène le long du 2ème axe (colonnes du 1er, puis colonnes du 2ème):

np.concatenate((a, b), axis=1)
array([[ 1,  5,  9,  3,  7, 11],
       [ 2,  6, 10,  4,  8, 12]])

pour obtenir le résultat que vous avez présenté, vous pouvez utiliser vstack

a = np.array([1,2,3])
b = np.array([4,5,6])
np.vstack((a, b))
array([[1, 2, 3],
       [4, 5, 6]])

Vous pouvez toujours le faire avec concatenate, mais vous devez d'abord les remodeler:

np.concatenate((a.reshape(1,3), b.reshape(1,3)))
array([[1, 2, 3],
       [4, 5, 6]])

Enfin, comme proposé dans les commentaires, une façon de les modifier est d’utiliser newaxis:

np.concatenate((a[np.newaxis,:], b[np.newaxis,:]))
81
gg349

Si le problème actuel est de concaténer deux tableaux à une dimension verticalement et que nous ne sommes pas concentrés sur l'utilisation de concatenate pour effectuer cette opération, je suggérerais l'utilisation de - np.column_stack:

In []: a = np.array([1,2,3])
In []: b = np.array([4,5,6])
In []: np.column_stack((a, b))
array([[1, 4],
       [2, 5],
       [3, 6]])
21
Kshitij Saraogi

Une fonction peu connue de numpy est d'utiliser r_. C'est un moyen simple de construire rapidement des tableaux:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.r_[a[None,:],b[None,:]]
print(c)
#[[1 2 3]
# [4 5 6]]

Le but de a[None,:] est d’ajouter un axe au tableau a.

9
bougui
a = np.array([1,2,3])
b = np.array([4,5,6])
np.array((a,b))

fonctionne aussi bien que

np.array([[1,2,3], [4,5,6]])

Que ce soit une liste de listes ou une liste de tableaux 1d, np.array essaie de créer un tableau 2d.

Mais c’est aussi une bonne idée de comprendre le fonctionnement de np.concatenate et de sa famille de fonctions stack. Dans ce contexte, concatenate a besoin d'une liste de tableaux 2D (ou de tout ce que np.array deviendra un tableau 2d) en tant qu'entrées.

np.vstack commence par boucler les entrées en s'assurant qu'elles sont au moins 2d, puis concatène. Sur le plan fonctionnel, vous élargissez vous-même les dimensions des tableaux.

np.stack est une nouvelle fonction qui joint les tableaux sur une nouvelle dimension. Le comportement par défaut se comporte exactement comme np.array.

Regardez le code pour ces fonctions. Si vous l’écrivez en Python, vous pouvez en apprendre beaucoup. Pour vstack:

return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
5
hpaulj