2017-05-28 4 views
-3

Ich habe einen Fehler, IndexError: nur ganze Zahlen, Slices (:), Ellipse (...), numpy.newaxis (None) und Integer oder Boolesche Arrays sind gültige Indizes. Ich mache Sound Recognition App. Mein Code istIndexError Kann int als Index verwendet werden?

import numpy as np 
import pandas as pd 
import scipy as sp 
import pickle 
from scipy import fft 
from time import localtime, strftime 
import matplotlib.pyplot as plt 
from skimage.morphology import disk,remove_small_objects 
from skimage.filter import rank 
from skimage.util import img_as_ubyte 
import wave 

folder = 'mlsp_contest_dataset/' 


essential_folder = folder+'essential_data/' 
supplemental_folder = folder+'supplemental_data/' 
spectro_folder =folder+'my_spectro/' 
single_spectro_folder =folder+'my_spectro_single/' 
dp_folder = folder+'DP/' 

# Each audio file has a unique recording identifier ("rec_id"), ranging from 0 to 644. 
# The file rec_id2filename.txt indicates which wav file is associated with each rec_id. 
rec2f = pd.read_csv(essential_folder + 'rec_id2filename.txt', sep = ',') 

# There are 19 bird species in the dataset. species_list.txt gives each a number from 0 to 18. 
species = pd.read_csv(essential_folder + 'species_list.txt', sep = ',') 
num_species = 19 

# The dataset is split into training and test sets. 
# CVfolds_2.txt gives the fold for each rec_id. 0 is the training set, and 1 is the test set. 
cv = pd.read_csv(essential_folder + 'CVfolds_2.txt', sep = ',') 

# This is your main label training data. For each rec_id, a set of species is listed. The format is: 
# rec_id,[labels] 
raw = pd.read_csv(essential_folder + 'rec_labels_test_hidden.txt', sep = ';') 
label = np.zeros(len(raw)*num_species) 
label = label.reshape([len(raw),num_species]) 
for i in range(len(raw)): 
    line = raw.iloc[i] 
    labels = line[0].split(',') 
    labels.pop(0) # rec_id == i 
    for c in labels: 
     if(c != '?'): 
      print(label) 
      label[i,c] = 1 

ich diesen Code ausführen, ich in diesem Punkt label[i,c] = 1 den Fehler bekam. Ich versuchte label Variable von print(label) label zu sehen ist wie

warn(skimage_deprecation('The `skimage.filter` module has been renamed ' 
[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

Ich denke, der Fehler bedeutet, ganze Zahlen, Scheiben (:), Auslassungszeichen (...), numpy.newaxis (None) und integer oder boolean kann nicht als Array-Indizes verwendet werden, aber ich habe Int in Array-Index viel Zeit, so dass ich nicht verstehen kann, warum dieser Fehler passiert. Debug sagte mir,

labels 

Etiketten hat :: [ '?'].

c 

von

for c in labels[i]: 

hat '?', Ich kann wirklich nicht verstehen? type.Ich denke das? den Fehler verursachen, aber ich weiß nicht, wie ich das beheben kann. Wie kann ich das beheben?

+0

'für c in Etiketten: ...', aber 'labels' ist eine Liste von Strings. Strings sind nicht in der Menge "* Ganzzahlen, Slices (:), Auslassungszeichen (...), numpy.newaxis (None) und Integer oder Boolean *". (Beachten Sie auch: 'np.zeros ((len (roh), num_species)' ist einfacher.) –

+0

@AndrasDeak vielen Dank !! Welcher Teil ist np?Nullen ((len (roh), num_species)) das hast du mir gesagt? Wie kann ich das beheben? – user21063

+0

Ich habe nur bemerkt, dass Ihre zwei Zeilen vor der for-Schleife in einer Zeile ausgeführt werden können, ohne umformen zu müssen. Was Ihr Problem anbetrifft: Ich weiß nicht, was Sie tun wollen, aber der Versuch, Zeichen als Nummernmatrix-Indizes zu verwenden, wird sicherlich nicht funktionieren. –

Antwort

0

Die Fehlermeldung wird von selbst, dass, wenn eine

numpy Array Indexieren
only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices 

label ein 2D-Array von Schwimmern ist, mit aktuellem Wert von 0 .:

label = np.zeros([len(raw),num_species]) 

In der Schleife:

for i in range(len(raw)):  # i=0,1,2,... 

haben Sie überprüft, was raw ist? Von pd.read_csv kommend stelle ich mir vor, es ist ein Datenrahmen; iloc[i] wählt eine Zeile aus, ist aber nicht bereits in Spalten aufgeteilt?

line = raw.iloc[i] 
    labels = line[0].split(',') 
    labels.pop(0) # rec_id == i 

was ist labels? Ich vermute, es ist jede Array von Strings

for c in labels: 
     if(c != '?'):   # evidently `c` is a string 
      print(label)  # prints the 2d array 
      label[i,c] = 1 

Indizierung für eine 2D-Array sollte so etwas wie label[0,1] sein. c könnte eines der anderen Dinge in der Fehlermeldung sein. Aber es kann keine Schnur sein.

Datenrahmen erlauben die Indizierung mit Strings - das ist eine Pandas-Funktion. Aber numpy Arrays müssen numerische Indizes oder einige Alternativen haben. Sie sind nicht mit Strings indiziert (außer bei strukturierten Arrays).


In [209]: label = np.zeros((3,5)) 
In [210]: label 
Out[210]: 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 
In [211]: label[1,3] 
Out[211]: 0.0 
In [212]: label[1,3]=1  # index with integers OK 
In [213]: label[0,2]=1 
In [214]: label[0,'?'] =1 # index with a string - ERROR 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-214-3738f623c78e> in <module>() 
----> 1 label[0,'?'] =1 

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 

In [215]: label[0,:] =2  # index with a slice 
In [216]: label 
Out[216]: 
array([[ 2., 2., 2., 2., 2.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0.]]) 
Verwandte Themen