Aggiunta non riuscita a un array NumPy vuoto

2022-07-29 12:00:12

Sto cercando di riempire un array vuoto (non np.empty!) con valori usando append ma sto ottenendo un errore:

Il mio codice è il seguente:

import numpy as np
result=np.asarray([np.asarray([]),np.asarray([])])
result[0]=np.append([result[0]],[1,2])

E ricevo:

ValueError: could not broadcast input array from shape (2) into shape (0)

- Cupitor

Source
Risposta


32
  • numpy.append è piuttosto diverso da list.append in Python. So che è stato respinto da alcuni programmatori nuovi a numpy. numpy.append è più simile a concatenare, crea un nuovo array e lo riempie con i valori del vecchio array e i nuovi valori da aggiungere. Ad esempio:

    import numpy
    
    old = numpy.array([1, 2, 3, 4])
    new = numpy.append(old, 5)
    print old
    # [1, 2, 3, 4]
    print new
    # [1, 2, 3, 4, 5]
    new = numpy.append(new, [6, 7])
    print new
    # [1, 2, 3, 4, 5, 6, 7]
    

    Penso che potresti essere in grado di raggiungere il tuo obiettivo facendo qualcosa del tipo:

    result = numpy.zeros((10,))
    result[0:2] = [1, 2]
    
    # Or
    result = numpy.zeros((10, 2))
    result[0, :] = [1, 2]
    

    Aggiornamento:

    Se devi creare un array numpy usando loop e non sai in anticipo quale sarà la dimensione finale dell'array, puoi fare qualcosa del tipo:

    import numpy as np
    
    a = np.array([0., 1.])
    b = np.array([2., 3.])
    
    temp = []
    while True:
        rnd = random.randint(0, 100)
        if rnd > 50:
            temp.append(a)
        else:
            temp.append(b)
        if rnd == 0:
             break
    
     result = np.array(temp)
    

    Nel mio esempio il risultato sarà un array (N, 2), dove N è il numero di volte in cui il ciclo è stato eseguito, ma ovviamente puoi adattarlo alle tue esigenze.

    nuovo aggiornamento

    L'errore che stai vedendo non ha nulla a che fare con i tipi, ha a che fare con la forma degli array numpy che stai cercando di concatenare. Se esegui np.append(a, b) le forme di a e b devono corrispondere. Se aggiungi un (2, n) e (n,) otterrai un array (3, n). Il tuo codice sta cercando di aggiungere un (1, 0) a un (2,). Queste forme non corrispondono, quindi viene visualizzato un errore.