2011-01-12 1 views
73
codice

Questo Python:ValueError: l'impostazione di un elemento di un array con una sequenza

import numpy as p 

def firstfunction(): 
    UnFilteredDuringExSummaryOfMeansArray = [] 
    MeanOutputHeader=['TestID','ConditionName','FilterType','RRMean','HRMean','dZdtMaxVoltageMean','BZMean','ZXMean' 
         ,'LVETMean','Z0Mean','StrokeVolumeMean','CardiacOutputMean','VelocityIndexMean'] 
    dataMatrix = BeatByBeatMatrixOfMatrices[column] 
    roughTrimmedMatrix = p.array(dataMatrix[1:,1:17]) 


    trimmedMatrix = p.array(roughTrimmedMatrix,dtype=p.float64) #ERROR THROWN HERE 


    myMeans = p.mean(trimmedMatrix,axis=0,dtype=p.float64) 
    conditionMeansArray = [TestID,testCondition,'UnfilteredBefore',myMeans[3], myMeans[4], myMeans[6], myMeans[9] 
         , myMeans[10], myMeans[11], myMeans[12], myMeans[13], myMeans[14], myMeans[15]] 
    UnFilteredDuringExSummaryOfMeansArray.append(conditionMeansArray) 
    secondfunction(UnFilteredDuringExSummaryOfMeansArray) 
    return 

def secondfunction(UnFilteredDuringExSummaryOfMeansArray): 
    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3] 
    return 

firstfunction() 

Mandate questo messaggio di errore:

File "mypath\mypythonscript.py", line 3484, in secondfunction 
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3] 
ValueError: setting an array element with a sequence. 

Qualcuno può farmi vedere cosa fare per risolvere il problema nel codice spezzato sopra in modo che smetta di lanciare un messaggio di errore?


EDIT: Ho fatto un comando di stampa per ottenere il contenuto della matrice, e questo è quello che stampata:

UnFilteredDuringExSummaryOfMeansArray è:

[['TestID', 'ConditionName', 'FilterType', 'RRMean', 'HRMean', 'dZdtMaxVoltageMean', 'BZMean', 'ZXMean', 'LVETMean', 'Z0Mean', 'StrokeVolumeMean', 'CardiacOutputMean', 'VelocityIndexMean'], 
[u'HF101710', 'PreEx10SecondsBEFORE', 'UnfilteredBefore', 0.90670000000000006, 66.257731979420001, 1.8305673000000002, 0.11750000000000001, 0.15120546389880002, 0.26870546389879996, 27.628261216480002, 86.944190346160013, 5.767261352345999, 0.066259118585869997], 
[u'HF101710', '25W10SecondsBEFORE', 'UnfilteredBefore', 0.68478571428571422, 87.727887206978565, 2.2965444125714285, 0.099642857142857144, 0.14952476549885715, 0.24916762264164286, 27.010483303721429, 103.5237336525, 9.0682762747642869, 0.085022572648242867], 
[u'HF101710', '50W10SecondsBEFORE', 'UnfilteredBefore', 0.54188235294117659, 110.74841107829413, 2.6719262705882354, 0.077705882352917643, 0.15051306356552943, 0.2282189459185294, 26.768787504858825, 111.22827075238826, 12.329456404418824, 0.099814258468417641], 
[u'HF101710', '75W10SecondsBEFORE', 'UnfilteredBefore', 0.4561904761904762, 131.52996981880955, 3.1818159523809522, 0.074714285714290493, 0.13459344175047619, 0.20930772746485715, 26.391156337028569, 123.27387909873812, 16.214243779323812, 0.1205685359981619]] 

Sembra una Matrice a 5 righe per 13 colonne, sebbene il numero di righe sia variabile quando vengono eseguiti dati diversi attraverso lo script. Con gli stessi dati che sto aggiungendo in questo.

EDIT 2: Tuttavia, lo script sta gettando un errore. Quindi non penso che la tua idea spieghi il problema che sta accadendo qui. Grazie comunque. Altre idee?


EDIT 3:

proposito, se sostituisco questa linea problema di codice:

RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3] 

con questo, invece:

RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray)[1:,3] 

Poi quella sezione della lo script funziona bene senza generare un errore, ma successivamente questa riga di codice su tutta la linea:

p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max()) 

Lanci questo errore:

File "mypath\mypythonscript.py", line 3631, in CreateSummaryGraphics 
    p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max()) 
TypeError: cannot perform reduce with flexible type 

Così si può vedere che ho bisogno di specificare il tipo di dati al fine di essere in grado di utilizzare ylim in matplotlib, ma tuttavia specificare i dati tipo sta lanciando il messaggio di errore che ha avviato questo post.

risposta

122

Dal codice che ci hai mostrato, l'unica cosa che possiamo dire è che stai cercando di creare un array da un elenco che non ha la forma di un array multidimensionale. Ad esempio

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

o

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

produrrà questo messaggio di errore, perché la forma della lista in ingresso non è un (generalizzato) "box" che può essere trasformato in una matrice multidimensionale. Quindi probabilmente UnFilteredDuringExSummaryOfMeansArray contiene sequenze di diverse lunghezze.

Edit: Un'altra possibile causa per questo messaggio di errore sta cercando di utilizzare una stringa come un elemento di un array di tipo float:

numpy.array([1.2, "abc"], dtype=float) 

Questo è ciò che si sta cercando in base alla tua modifica. Se si vuole veramente avere un allineamento NumPy contenente entrambe le stringhe e galleggianti, è possibile utilizzare il DTYPE object, che consente l'array per contenere oggetti Python arbitrari:

numpy.array([1.2, "abc"], dtype=object) 

Senza sapere che cosa il vostro codice deve realizzare, posso' t giudicare se questo è quello che vuoi.

+0

Grazie, ma non penso che sia la risposta. Ho aggiunto il contenuto della matrice quando lancia l'errore sopra. E mi sembra che sia una scatola quando la incollo nel blocco note e la esaminiamo riga per riga. Altre idee? – MedicalMath

+1

La tua modifica sembra aver risolto il mio problema. Avevo bisogno di impostare il dtype = object. Grazie mille. – MedicalMath

+0

Questa domanda è stata completamente risposta. – MedicalMath

6

Il Python ValueError:

ValueError: setting an array element with a sequence. 

significa esattamente quello che dice, si sta cercando di stipare una sequenza di numeri in un singolo slot numero. Può essere lanciato in varie circostanze.

1. Quando si passa una tupla pitone o elenco debba essere interpretato come un elemento di matrice NumPy:

import numpy 

numpy.array([1,2,3])    #good 

numpy.array([1, (2,3)])   #Fail, can't convert a tuple into a numpy 
            #array element 


numpy.mean([5,(6+7)])    #good 

numpy.mean([5,tuple(range(2))]) #Fail, can't convert a tuple into a numpy 
            #array element 


def foo(): 
    return 3 
numpy.array([2, foo()])   #good 


def foo(): 
    return [3,4] 
numpy.array([2, foo()])   #Fail, can't convert a list into a numpy 
            #array element 

2. Cercando di stipare una lunghezza matrice NumPy> 1 in un elemento di matrice numpy : viene creata

x = np.array([1,2,3]) 
x[0] = np.array([4])   #good 



x = np.array([1,2,3]) 
x[0] = np.array([4,5])  #Fail, can't convert the numpy array to fit 
          #into a numpy array element 

Una matrice NumPy, e NumPy non sa come stipare tuple multivalore o array negli slot singolo elemento. Si aspetta qualunque cosa tu gli dai per valutare un singolo numero, in caso contrario, Numpy risponde che non sa come impostare un elemento dell'array con una sequenza.