2012-04-27 13 views

risposta

68
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]]) 
+3

Il REPL significa tagliare verso il basso su questioni principiante sensibilmente . –

+8

questo converte automaticamente un elenco di liste in un array 2D perché la lunghezza di tutti gli elenchi inclusi è la stessa. Sai come non farlo: creare una serie di liste anche se tutte le liste hanno la stessa lunghezza? Oppure è possibile convertire un array 2D in un array 1D di array 1D (in modo efficiente intendo, nessun metodo iterativo o roba mappa Python) –

+3

Se ciò non funziona per te perché le sottoliste non sono di dimensioni pari, vedi [il risposta successiva] (http://stackoverflow.com/a/26224619/1449460). –

9

E 'semplice come:

>>> lists = [[1, 2], [3, 4]] 
>>> np.array(lists) 
array([[1, 2], 
     [3, 4]]) 
76

Se l'elenco delle liste ha liste con numero di elementi rispetto alla risposta di Ignacio Vazquez-Abrams non funzioneranno variabile. Invece ci sono 3 opzioni:

1) Fai un array di array:

x=[[1,2],[1,2,3],[1]] 
y=numpy.array([numpy.array(xi) for xi in x]) 
type(y) 
>>><type 'numpy.ndarray'> 
type(y[0]) 
>>><type 'numpy.ndarray'> 

2) Fai una serie di liste:

x=[[1,2],[1,2,3],[1]] 
y=numpy.array(x) 
type(y) 
>>><type 'numpy.ndarray'> 
type(y[0]) 
>>><type 'list'> 

3) Prima di tutto le liste uguale in lunghezza:

x=[[1,2],[1,2,3],[1]] 
length = len(sorted(x,key=len, reverse=True)[0]) 
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x]) 
y 
>>>array([[1, 2, None], 
>>>  [1, 2, 3], 
>>>  [1, None, None]], dtype=object) 
+7

Grazie, sono venuto qui per questo. Ho usato numpy per un po 'e ho trovato questo comportamento non banale. Grazie per aver dedicato del tempo a spiegare questo caso più generale. –

+0

Pollice in su per questa risposta! – alisa

15

Poiché questa è la ricerca principale su Google per la conversione di un elenco di elenchi in un array Numpy, offrirò i seguenti nonostante la domanda sia di 4 anni:

>>> x = [[1, 2], [1, 2, 3], [1]] 
>>> y = numpy.hstack(x) 
>>> print(y) 
[1 2 1 2 3 1] 

Quando ho pensato di fare in questo modo, sono stato molto soddisfatto di me stesso perché è soooo semplice. Tuttavia, dopo la sincronizzazione con una più grande lista di liste, in realtà è più veloce per fare questo:

>>> y = numpy.concatenate([numpy.array(i) for i in x]) 
>>> print(y) 
[1 2 1 2 3 1] 

noti che @ risposta di Bastiaan # 1 non fa una sola lista continua, quindi ho aggiunto il concatenate.

Comunque ... Preferisco l'approccio hstack per il suo elegante uso di Numpy.

0

Anche in questo caso, dopo aver cercato per il problema della conversione di liste annidate con livelli di N in un array N-dimensionale non ho trovato nulla, ecco il mio modo intorno ad esso:

import numpy as np 

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3