Aggiungi un array NumPy a un array NumPy


180

Ho un numpy_array. Qualcosa del genere [ a b c ].

E poi voglio aggiungerlo in un altro array NumPy (proprio come creiamo un elenco di elenchi). Come possiamo creare una matrice di matrici NumPy contenenti matrici NumPy?

Ho provato a fare quanto segue senza fortuna

>>> 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
È possibile creare un "array di array" (si utilizza un array di oggetti), ma quasi sicuramente non si desidera. Cosa stai cercando di fare? Vuoi solo un array 2d?
Joe Kington

Risposte:


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

o questo:

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
Ciao, quando eseguo questo, ottengo questo np.concatenate ((a, b), axis = 1) Output: array ([1, 2, 3, 2, 3, 4]) Ma quello che sto cercando è numpy 2d array? ?
frazman,

3
@Fraz: ho aggiunto l' vstack()idea di Sven . Sai che puoi creare l'array con array([[1,2,3],[2,3,4]]), giusto?
endolith

concatenate () è quello di cui avevo bisogno.
Kakyo,

1
numpy.vstackpuò accettare più di 2 matrici nell'argomento sequenza. Pertanto, se è necessario combinare più di 2 array, vstack è più utile.
Ruhong,

1
@oneleggedmule concatenatepuò anche prendere più array
endolith

73

Bene, il messaggio di errore dice tutto: le matrici NumPy non hanno un append()metodo. C'è una funzione gratuita numpy.append()tuttavia:

numpy.append(M, a)

Questo creerà un nuovo array invece di mutare Msul posto. Si noti che l'utilizzo numpy.append()implica la copia di entrambi gli array. Otterrai un codice con prestazioni migliori se utilizzi array NumPy di ​​dimensioni fisse.


Ciao .. quando provo questo .. ottengo questo >>> np.append (M, a) array ([1., 2., 3.]) >>> np.append (M, b) array ([ 2., 3., 4.]) >>> M array ([], dtype = float64) Speravo che M fosse un array 2D ??
Frazman,

8
@Fraz: dai un'occhiata numpy.vstack().
Sven Marnach,

Penso che questa dovrebbe essere la risposta accettata in quanto risponde precisamente al punto.
Prasad Raghavendra,

31

Puoi usare 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]

Ciò non creerà due array separati ma aggiungerà due array in un array monodimensionale.


10

Sven ha detto tutto, basta essere molto cauti a causa delle regolazioni automatiche del tipo quando si chiama append.

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

Come vedi in base al contenuto, il tipo è passato da int64 a float32 e quindi a S1


7

Ho trovato questo link mentre cercavo qualcosa di leggermente diverso, come iniziare ad aggiungere oggetti array a un array numpy vuoto , ma ho provato tutte le soluzioni in questa pagina senza risultati.

Quindi ho trovato questa domanda e la risposta: Come aggiungere una nuova riga a un array numpy vuoto

L'essenza qui:

Il modo per "avviare" l'array desiderato è:

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

Quindi puoi utilizzare concatenare per aggiungere righe in questo modo:

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

Vedi anche https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html


4

In realtà si può sempre creare un normale elenco di matrici intorpidite e convertirlo in un secondo momento.

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

Ho avuto lo stesso problema e non ho potuto commentare la risposta di @Sven Marnach (non abbastanza rappresentante, cavolo, ricordo che quando Stackoverflow è iniziato ...) comunque.

Aggiunta di un elenco di numeri casuali a una 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:]

Utilizzando np.zeros () viene creato un array con 1 x 10 zeri.

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

Quindi viene creato un elenco di 10 numeri casuali utilizzando np.random e assegnato a randomList. Il loop lo impila in alto 10. Non ci resta che ricordare di rimuovere la prima voce vuota.

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

Quindi in una funzione:

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 array 7 x 7 che utilizza numeri casuali 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

Se capisco la tua domanda, ecco un modo. Dì che hai:

a = [4.1, 6.21, 1.0]

quindi ecco un po 'di codice ...

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

Il quale conduce a:

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

Prova questo codice:

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)

Inoltre puoi usare l'array invece di "a"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.