ValueError: impostazione di un elemento dell'array con una sequenza

Questo codice Python:

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()

Lancia 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ò mostrarmi cosa fare per risolvere il problema nel codice rotto qui 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 è ciò che ha stampato:

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]]

Mi sembra una matrice di 5 righe per 13 colonne, anche se il numero di righe è variabile quando diversi dati vengono eseguiti attraverso lo script. Con questi stessi dati che sto aggiungendo in questo.

EDIT 2: Tuttavia, lo script sta lanciando un errore. Quindi non credo che la tua idea spieghi il problema che sta accadendo qui. Grazie comunque. Qualche altra idea?


EDIT 3:

Per tua informazione, se sostituisco questa linea di codice problematica

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

con questo invece:

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

Allora quella sezione dello script funziona bene senza lanciare un errore, ma poi questa linea di codice più in basso:

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

Lancia 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

Quindi potete vedere che ho bisogno di specificare il tipo di dati per essere in grado di usare ylim in matplotlib, ma specificare il tipo di dati sta lanciando il messaggio di errore che ha iniziato questo post.

Soluzione

Dal codice che ci hai mostrato, l'unica cosa che possiamo dire è che stai cercando di creare un array da una lista che non ha la forma di un array multidimensionale. Per 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 di input non è una (generalizzata) "scatola" che può essere trasformata in un array multidimensionale. Quindi probabilmente UnFilteredDuringExSummaryOfMeansArray contiene sequenze di diversa lunghezza.

Modifica: Un'altra possibile causa di questo messaggio di errore è il tentativo di usare una stringa come elemento in un array di tipo float:

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

Questo è ciò che stai cercando secondo la tua modifica. Se vuoi davvero avere un array NumPy contenente sia stringhe che float, potresti usare il dtype object, che permette all'array di contenere oggetti Python arbitrari:

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

Senza sapere cosa deve fare il tuo codice, non posso giudicare se questo è ciò che vuoi.

Commentari (4)

Il ValueError di Python:

ValueError: setting an array element with a sequence.

Significa esattamente quello che dice, state cercando di stipare una sequenza di numeri in un singolo slot numerico. Può essere lanciato in varie circostanze.

1. Quando si passa una tupla o una lista python da interpretare come elemento di un array 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 di array numpy > 1 in un elemento di array numpy:

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

Si sta creando un array numpy, e numpy non sa come stipare tuple o array multivalutati in slot di elementi singoli. Si aspetta che qualsiasi cosa gli si dia da valutare sia un singolo numero, se non lo fa, Numpy risponde che non sa come impostare un elemento dell'array con una sequenza.

Commentari (0)

Nel mio caso, il problema era un altro. Stavo cercando di convertire liste di liste di int in array. Il problema era che c'era una lista con una lunghezza diversa dalle altre. Se volete provarlo, dovete farlo:

print([i for i,x in enumerate(list) if len(x) != 560])

Nel mio caso, il riferimento alla lunghezza era 560.

Commentari (0)