Ajouter un tableau NumPy à un tableau NumPy

181

J'ai un numpy_array. Quelque chose comme [ a b c ].

Et puis je veux l'ajouter dans un autre tableau NumPy (tout comme nous créons une liste de listes). Comment créer un tableau de tableaux NumPy contenant des tableaux NumPy?

J'ai essayé de faire ce qui suit sans aucune chance

>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])
Frazman
la source
3
Vous pouvez créer un "tableau de tableaux" (vous utilisez un tableau d'objets), mais vous ne le souhaitez presque certainement pas. Qu'essayez-vous de faire? Voulez-vous juste un tableau 2D?
Joe Kington

Réponses:

214
In [1]: import numpy as np

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

In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])

In [4]: np.concatenate((a, b))
Out[4]: 
array([[1, 2, 3],
       [4, 5, 6],
       [9, 8, 7],
       [6, 5, 4]])

ou ca:

In [1]: a = np.array([1, 2, 3])

In [2]: b = np.array([4, 5, 6])

In [3]: np.vstack((a, b))
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]])
endolithe
la source
1
Salut quand je lance ceci, j'obtiens ce np.concatenate ((a, b), axis = 1) Sortie: tableau ([1, 2, 3, 2, 3, 4]) Mais ce que je recherche est un tableau numpy 2d? ?
frazman
3
@Fraz: J'ai ajouté l' vstack()idée de Sven . Vous savez que vous pouvez créer le tableau avec array([[1,2,3],[2,3,4]]), non?
endolith
concatenate () est celui dont j'avais besoin.
kakyo
1
numpy.vstackpeut accepter plus de 2 tableaux dans l'argument de séquence. Ainsi, si vous avez besoin de combiner plus de 2 tableaux, vstack est plus pratique.
ruhong
1
@oneleggedmule concatenatepeut également prendre plusieurs tableaux
endolith
74

Eh bien, le message d'erreur dit tout: les tableaux NumPy n'ont pas de append()méthode. Il existe numpy.append()cependant une fonction gratuite :

numpy.append(M, a)

Cela créera un nouveau tableau au lieu de muter Msur place. Notez que l'utilisation numpy.append()implique la copie des deux tableaux. Vous obtiendrez un code plus performant si vous utilisez des tableaux NumPy de taille fixe.

Sven Marnach
la source
Salut .. quand j'essaye ceci .. J'obtiens ce >>> np.append (M, a) array ([1., 2., 3.]) >>> np.append (M, b) array ([ 2., 3., 4.]) >>> M tableau ([], dtype = float64) J'espérais que M soit un tableau 2D ??
frazman
8
@Fraz: Jetez un œil à numpy.vstack().
Sven Marnach
Je pense que cela devrait être la réponse acceptée car elle répond précisément à ce point.
Prasad Raghavendra
31

Vous pouvez utiliser numpy.append()...

import numpy

B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )

print B

> [3 1 2 2]

Cela ne créera pas deux tableaux séparés mais ajoutera deux tableaux dans un tableau à une seule dimension.

Zhai Zhiwei
la source
10

Sven a tout dit, soyez très prudent en raison des ajustements de type automatiques lorsque append est appelé.

In [2]: import numpy as np

In [3]: a = np.array([1,2,3])

In [4]: b = np.array([1.,2.,3.])

In [5]: c = np.array(['a','b','c'])

In [6]: np.append(a,b)
Out[6]: array([ 1.,  2.,  3.,  1.,  2.,  3.])

In [7]: a.dtype
Out[7]: dtype('int64')

In [8]: np.append(a,c)
Out[8]: 
array(['1', '2', '3', 'a', 'b', 'c'], 
      dtype='|S1')

Comme vous le voyez, basé sur le contenu, le dtype est passé de int64 à float32, puis à S1

lukecampbell
la source
7

J'ai trouvé ce lien en cherchant quelque chose de légèrement différent, comment commencer à ajouter des objets de tableau à un tableau numpy vide , mais j'ai essayé toutes les solutions de cette page en vain.

Ensuite, j'ai trouvé cette question et réponse: Comment ajouter une nouvelle ligne à un tableau numpy vide

L'essentiel ici:

La façon de «démarrer» le tableau que vous souhaitez est:

arr = np.empty((0,3), int)

Ensuite, vous pouvez utiliser concaténer pour ajouter des lignes comme ceci:

arr = np.concatenate( ( arr, [[x, y, z]] ) , axis=0)

Voir aussi https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

Clay Coleman
la source
4

En fait, on peut toujours créer une liste ordinaire de tableaux numpy et la convertir plus tard.

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

In [3]: b = np.array([[1,2],[3,4]])

In [4]: l = [a]

In [5]: l.append(b)

In [6]: l = np.array(l)

In [7]: l.shape
Out[7]: (2, 2, 2)

In [8]: l
Out[8]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])
Michael Ma
la source
2

J'ai eu le même problème, et je ne pouvais pas commenter la réponse de @Sven Marnach (pas assez de représentants, bon sang, je me souviens quand Stackoverflow a commencé ...) de toute façon.

Ajout d'une liste de nombres aléatoires à une matrice 10 X 10.

myNpArray = np.zeros([1, 10])
for x in range(1,11,1):
    randomList = [list(np.random.randint(99, size=10))]
    myNpArray = np.vstack((myNpArray, randomList))
myNpArray = myNpArray[1:]

En utilisant np.zeros (), un tableau est créé avec 1 x 10 zéros.

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

Ensuite, une liste de 10 nombres aléatoires est créée en utilisant np.random et assignée à randomList. La boucle l'empile 10 de haut. Nous devons juste nous rappeler de supprimer la première entrée vide.

myNpArray

array([[31., 10., 19., 78., 95., 58.,  3., 47., 30., 56.],
       [51., 97.,  5., 80., 28., 76., 92., 50., 22., 93.],
       [64., 79.,  7., 12., 68., 13., 59., 96., 32., 34.],
       [44., 22., 46., 56., 73., 42., 62.,  4., 62., 83.],
       [91., 28., 54., 69., 60., 95.,  5., 13., 60., 88.],
       [71., 90., 76., 53., 13., 53., 31.,  3., 96., 57.],
       [33., 87., 81.,  7., 53., 46.,  5.,  8., 20., 71.],
       [46., 71., 14., 66., 68., 65., 68., 32.,  9., 30.],
       [ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
       [13., 36., 43., 45., 90., 17., 38.,  1., 41., 33.]])

Donc dans une fonction:

def array_matrix(random_range, array_size):
    myNpArray = np.zeros([1, array_size])
    for x in range(1, array_size + 1, 1):
        randomList = [list(np.random.randint(random_range, size=array_size))]
        myNpArray = np.vstack((myNpArray, randomList))
    return myNpArray[1:]

un tableau 7 x 7 utilisant des nombres aléatoires de 0 à 1000

array_matrix(1000, 7)

array([[621., 377., 931., 180., 964., 885., 723.],
       [298., 382., 148., 952., 430., 333., 956.],
       [398., 596., 732., 422., 656., 348., 470.],
       [735., 251., 314., 182., 966., 261., 523.],
       [373., 616., 389.,  90., 884., 957., 826.],
       [587., 963.,  66., 154., 111., 529., 945.],
       [950., 413., 539., 860., 634., 195., 915.]])
Aile
la source
1

Si je comprends votre question, voici une solution. Dites que vous avez:

a = [4.1, 6.21, 1.0]

alors voici un peu de code ...

def array_in_array(scalarlist):
    return [(x,) for x in scalarlist]

Qui conduit à:

In [72]: a = [4.1, 6.21, 1.0]

In [73]: a
Out[73]: [4.1, 6.21, 1.0]

In [74]: def array_in_array(scalarlist):
   ....:     return [(x,) for x in scalarlist]
   ....: 

In [75]: b = array_in_array(a)

In [76]: b
Out[76]: [(4.1,), (6.21,), (1.0,)]
linhares
la source
0

Essayez ce code:

import numpy as np

a1 = np.array([])

n = int(input(""))

for i in range(0,n):
    a = int(input(""))
    a1 = np.append(a, a1)
    a = 0

print(a1)

Vous pouvez également utiliser un tableau au lieu de "a"

Mehdi
la source