2015-10-15 14 views
22

Ho riscontrato questo errore nel titolo e non so cosa sia sbagliato. Funziona quando uso np.hstack invece di np.append, ma mi piacerebbe farlo più velocemente, quindi usa append.TypeError: solo gli array interi con un elemento possono essere convertiti in un indice 3

time_list a list of floats

heights is a 1d np.array of floats

j = 0 
n = 30 
time_interval = 1200 
axe_x = [] 

while j < np.size(time_list,0)-time_interval: 
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])): 
     axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))]) 

File "....", line .., in <module> 
    axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))]) 

TypeError: only integer arrays with one element can be converted to an index 
+0

Cosa stai cercando di ottenere con 'axe_x.append()'? Puoi mostrare i tuoi input e output? Gli elenchi di indici –

+0

non sono così potenti come con gli array. Accettano solo fette e interi. – hpaulj

+0

axe_x deve essere un array 1d di float generato dall'elenco time_list – GeoffreyB

risposta

34

Il problema è come l'errore indica, time_list è un elenco pitone normale, e quindi non può indice utilizzando un altro elenco (a meno che l'altro elenco è un array con elemento singolo). Esempio -

In [136]: time_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14] 

In [137]: time_list[np.arange(5,6)] 
Out[137]: 6 

In [138]: time_list[np.arange(5,7)] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-138-ea5b650a8877> in <module>() 
----> 1 time_list[np.arange(5,7)] 

TypeError: only integer arrays with one element can be converted to an index 

Se si vuole fare questo tipo di indicizzazione, si avrebbe bisogno di fare un time_listnumpy.array. Esempio -

In [141]: time_list = np.array(time_list) 

In [142]: time_list[np.arange(5,6)] 
Out[142]: array([6]) 

In [143]: time_list[np.arange(5,7)] 
Out[143]: array([6, 7]) 

Un'altra cosa da notare sarebbe che nel vostro while ciclo, non hai mai aumentare j, quindi potrebbe finire-up con ciclo infinito, si dovrebbe anche aumentare la j da una certa quantità (forse time_interval ?).


Ma secondo il requisito di cui hai postato commenti -

axe_x should be a 1d array of floats generated from the time_list list

Si consiglia di utilizzare .extend() invece di .append(), .append creerebbe un elenco di array per voi. Ma se hai bisogno di un array 1D, devi usare .extend(). Esempio -

time_list = np.array(time_list) 
while j < np.size(time_list,0)-time_interval: 
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])): 
     axe_x.extend(time_list[np.arange(j+n,j+(time_interval-n))]) 
     j += time_interval   #Or what you want to increase it by. 
+0

non funziona, ho lo stesso errore con estensione: axe_x.extend (time_list [np.arange (j, j + (time_interval))]) TypeError: solo gli array interi con un elemento possono essere convertiti in un indice – GeoffreyB

+2

Come ho detto, devi convertire 'time_list' in numpy array. Fai quello. –

+0

Grazie, funziona, ho letto troppo velocemente – GeoffreyB

Problemi correlati