web-dev-qa-db-fra.com

Ajouter un tableau NumPy à un tableau NumPy

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

Et ensuite, je souhaite l’appliquer à 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])
120
Fraz
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]])
153
endolith

Le message d'erreur dit tout: les baies NumPy n'ont pas de méthode append(). Il y a une fonction libre numpy.append() cependant:

numpy.append(M, a)

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

50
Sven Marnach

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 distincts, mais ajoutera deux tableaux dans un tableau à une dimension.

20
Zhai Zhiwei

Sven a tout dit, soyez très prudent à cause des ajustements de type automatiques quand 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 en fonction du contenu, le type de fichier est passé de int64 à float32, puis à S1.

9
lukecampbell

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 pour: en vain.

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

Le Gist ici:

Le moyen de "démarrer" le tableau que vous voulez est:

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

Ensuite, vous pouvez utiliser concatenate 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
Clay Coleman

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
Michael Ma

Si je comprends votre question, voici un moyen. Disons que vous avez:

a = [4.1, 6.21, 1.0]

alors voici du 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,)]
1
linhares

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

Ajouter une liste de nombres aléatoires à une matrice de 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 à l’aide de np.random et attribuée à randomList. La boucle empile 10 haut. Nous devons simplement 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 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
Wing