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])

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]])

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.


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.


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


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


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]]])

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.]])

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,)]

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"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.