ValueError: impostazione di un elemento array con una sequenza


183

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

Genera 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 sopra in modo che smetta di generare un messaggio di errore?


EDIT: ho fatto un comando di stampa per ottenere il contenuto della matrice, ed è quello 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 genera un errore. Quindi non penso che la tua idea spieghi il problema che sta accadendo qui. Grazie ugualmente. Altre idee?


EDIT 3:

Cordiali saluti, se sostituisco questa riga di codice problema:

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

con questo invece:

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

Quindi quella sezione dello script funziona bene senza generare un errore, ma poi questa riga di codice più in basso:

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

Genera 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 puoi vedere che devo specificare il tipo di dati per poter usare ylim in matplotlib, ma tuttavia specificare il tipo di dati sta lanciando il messaggio di errore che ha avviato questo post.


qualcuno vuole rimuovere tutti i dettagli irrilevanti da questa domanda?
Chris_Rands

Risposte:


254

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. Per esempio

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

o

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

produrrà questo messaggio di errore, poiché la forma dell'elenco di input non è una "scatola" (generalizzata) che può essere trasformata in un array multidimensionale. Quindi probabilmente UnFilteredDuringExSummaryOfMeansArraycontiene sequenze di lunghezze diverse.

Modifica : un'altra possibile causa di questo messaggio di errore sta provando a utilizzare una stringa come elemento in una matrice di tipo float:

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

Questo è ciò che stai provando in base alla tua modifica. Se vuoi davvero avere un array NumPy contenente sia stringhe che float, puoi usare il dtype object, che consente all'array di contenere oggetti Python arbitrari:

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

Senza sapere cosa deve realizzare il tuo codice, non posso giudicare se questo è quello che vuoi.


1
Grazie, ma non credo sia la risposta. Ho aggiunto il contenuto dell'array quando genera l'errore sopra. E mi sembra che sia una scatola quando la incollo nel blocco note e lo esamino riga per riga. Altre idee?
MedicalMath,

2
La tua modifica sembra aver risolto il mio problema. Avevo bisogno di impostare l'oggetto dtype =. Grazie mille.
MedicalMath

A questa domanda è stata data una risposta completa.
MedicalMath

Un'altra possibilità potrebbe essere un problema in 1.9 quando si __getitem__
crea

47

The Python ValueError:

ValueError: setting an array element with a sequence.

Significa esattamente ciò che dice, stai cercando di stipare una sequenza di numeri in un unico slot di numeri. Può essere lanciato in varie circostanze.

1. Quando passi una tupla o un elenco python da interpretare 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. Provando a stipare una lunghezza di matrice numpy> 1 in un elemento di matrice 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

Viene creato un array numpy e numpy non sa come stipare tuple o array multivalore in slot a elemento singolo. Si aspetta che qualunque cosa tu gli dia per valutare un singolo numero, in caso contrario, Numpy risponde che non sa come impostare un elemento di matrice con una sequenza.


spiegazione molto bella
Tejas Shetty,

15

Nel mio caso, ho ricevuto questo errore in Tensorflow, motivo per cui stavo cercando di alimentare un array con lunghezza o sequenze diverse:

esempio :

import tensorflow as tf

input_x = tf.placeholder(tf.int32,[None,None])



word_embedding = tf.get_variable('embeddin',shape=[len(vocab_),110],dtype=tf.float32,initializer=tf.random_uniform_initializer(-0.01,0.01))

embedding_look=tf.nn.embedding_lookup(word_embedding,input_x)

with tf.Session() as tt:
    tt.run(tf.global_variables_initializer())

    a,b=tt.run([word_embedding,embedding_look],feed_dict={input_x:example_array})
    print(b)

E se il mio array è:

example_array = [[1,2,3],[1,2]]

Quindi riceverò un errore:

ValueError: setting an array element with a sequence.

ma se faccio il riempimento allora:

example_array = [[1,2,3],[1,2,0]]

Adesso funziona.


Stavo usando pyCUDA e accidentalmente assegnato un gpuarray elemento dell'array NumPy. Ho avuto lo stesso errore.
Tirtha R,

@Aaditya Ura, come condurre tale imbottitura, puoi riferire qualcosa?
pari

7

per coloro che hanno problemi con problemi simili in Numpy, una soluzione molto semplice sarebbe:

definendo dtype=objectquando si definisce un array per assegnare valori ad esso. per esempio:

out = np.empty_like(lil_img, dtype=object)

3
In cosa differisce dalla Editparte della risposta accettata.
यमेव्यमेव जयते

Ha funzionato come un fascino!
mcagriardic,

5

Nel mio caso, il problema era un altro. Stavo provando a convertire elenchi di liste di int in array. Il problema era che c'era un elenco con una lunghezza diversa rispetto ad altri. Se vuoi provarlo, devi fare:

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

Nel mio caso, il riferimento di lunghezza era 560.


2

Nel mio caso, il problema era con un diagramma a dispersione di un frame di dati X []:

ax.scatter(X[:,0],X[:,1],c=colors,    
       cmap=CMAP, edgecolor='k', s=40)  #c=y[:,0],

#ValueError: setting an array element with a sequence.
#Fix with .toarray():
colors = 'br'
y = label_binarize(y, classes=['Irrelevant','Relevant'])
ax.scatter(X[:,0].toarray(),X[:,1].toarray(),c=colors,   
       cmap=CMAP, edgecolor='k', s=40)

Qualche spiegazione in più sarebbe carino.
Tejas Shetty,

1
L'errore value indica che stiamo provando a caricare un array n-element (sequenza) in un singolo slot numerico che ha solo un float. Quindi, stai cercando di impostare un elemento array con una sequenza. Con .toarray () lo ingrandiamo in una serie di sequenze. toarray () restituisce un ndarray;
Max Kleiner,

0

Quando la forma non è regolare o gli elementi hanno tipi di dati diversi, dtypepuò essere solo l' argomento passato a np.array object.

import numpy as np

# arr1 = np.array([[10, 20.], [30], [40]], dtype=np.float32)  # error
arr2 = np.array([[10, 20.], [30], [40]])  # OK, and the dtype is object
arr3 = np.array([[10, 20.], 'hello'])     # OK, and the dtype is also object

``


Benvenuti in SO. Questa domanda è molto vecchia e sembra che la tua risposta sia duplicata di almeno una delle altre. Se la tua risposta è effettivamente diversa, prova ad aggiungere qualche dettaglio in più che spiega come.
Jens Ehrich,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.