2013-08-26 5 views
7

Si consideri il seguente esempio semplice:Come assegnare un array numpy 1D all'array numpy 2D?

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 

X[:,0] = x # WORKS 

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1) 

X[:,0:1] = (x.reshape(-1, 1)) # WORKS 

Qualcuno può spiegare perché ha NumPy vettori di forma (N,) piuttosto che (N, 1)? Qual è il modo migliore per eseguire il cast dall'array 1D all'array 2D?

Perché ho bisogno di questo? Perché ho un codice che inserisce x in un array 2D X e la dimensione di x cambia di volta in volta, quindi ho X[:, idx1:idx2] = x che funziona se x è anche 2D ma non se x è 1D.

risposta

4

Hai davvero bisogno di essere in grado di gestire entrambi gli ingressi 1D e 2D con la stessa funzione? Se si conosce l'ingresso sarà 1D, utilizzare

X[:, i] = x 

Se si conosce l'ingresso sta per essere 2D, utilizzare

X[:, start:end] = x 

Se non si conoscono le dimensioni di ingresso, vi consiglio passare da una linea all'altra con uno if, sebbene possa esserci qualche trucco di indicizzazione di cui non sono a conoscenza che possa gestirlo in modo identico.

tuo x ha forma (N,) piuttosto che la forma (N, 1) (o (1, N)) perché NumPy non è costruita solo per matrice matematica. ndarrays sono n-dimensionali; supportano operazioni vettorizzate efficienti e coerenti per qualsiasi numero di dimensioni non negative (incluso 0). Mentre questo può occasionalmente rendere le operazioni di matrice un po 'meno concise (specialmente nel caso di dot per la moltiplicazione di matrici), produce codice più generalmente applicabile per quando i dati sono naturalmente monodimensionali o 3, 4 o n-dimensionali.

0

Penso che la risposta sia già inclusa nella domanda. Numpy consente agli array di essere di qualsiasi dimensionalità (mentre afaik Matlab preferisce due dimensioni ove possibile), quindi è necessario essere corretti con questo (e sempre distinguere tra (n,) e (n, 1)). Dando un numero come uno degli indici (come 0 nella 3a riga), riduci la dimensionalità di uno. Dando un intervallo come uno degli indici (come 0: 1 nella 4a riga), non riduci la dimensionalità.

La riga 3 ha perfettamente senso per me e assegnerei alla matrice 2-D in questo modo.

0

Ecco due trucchi che rendono il codice un po 'più breve.

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 
X.T[:1, :] = x 
X[:, 2:3] = x[:, None] 
+2

Potrebbe aggiungere qualche commento in più? Non mi è chiaro come sei arrivato dal codice originale e perché questo risolve il problema. – brandones