ValueError: Festlegen eines Array-Elements mit einer Sequenz

182

Dieser Python-Code:

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

Wirft diese Fehlermeldung:

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.

Kann mir jemand zeigen, was zu tun ist, um das Problem im fehlerhaften Code oben zu beheben, damit keine Fehlermeldung mehr ausgegeben wird?


BEARBEITEN: Ich habe einen Druckbefehl ausgeführt, um den Inhalt der Matrix abzurufen, und dies wurde ausgedruckt:

UnFilteredDuringExSummaryOfMeansArray ist:

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

Sieht für mich wie eine Matrix mit 5 Zeilen mal 13 Spalten aus, obwohl die Anzahl der Zeilen variabel ist, wenn verschiedene Daten durch das Skript ausgeführt werden. Mit den gleichen Daten, die ich hier hinzufüge.

EDIT 2 : Das Skript gibt jedoch einen Fehler aus. Ich glaube also nicht, dass Ihre Idee das Problem erklärt, das hier auftritt. Trotzdem danke. Irgendwelche anderen Ideen?


EDIT 3:

Zu Ihrer Information, wenn ich diese Problemcodezeile ersetze:

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

damit stattdessen:

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

Dann funktioniert dieser Abschnitt des Skripts einwandfrei, ohne einen Fehler auszulösen, aber dann diese Codezeile weiter unten:

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

Wirft diesen Fehler:

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

Sie sehen also, dass ich den Datentyp angeben muss, um ylim in matplotlib verwenden zu können. Wenn Sie jedoch den Datentyp angeben, wird die Fehlermeldung ausgegeben, die diesen Beitrag ausgelöst hat.

MedicalMath
quelle
Möchte jemand alle irrelevanten Details aus dieser Frage entfernen?
Chris_Rands

Antworten:

252

Anhand des Codes, den Sie uns gezeigt haben, können wir nur erkennen, dass Sie versuchen, ein Array aus einer Liste zu erstellen, die nicht wie ein mehrdimensionales Array geformt ist. Beispielsweise

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

oder

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

gibt diese Fehlermeldung aus, da die Form der Eingabeliste kein (verallgemeinertes) "Feld" ist, das in ein mehrdimensionales Array umgewandelt werden kann. UnFilteredDuringExSummaryOfMeansArrayEnthält also wahrscheinlich Sequenzen unterschiedlicher Länge.

Bearbeiten : Eine weitere mögliche Ursache für diese Fehlermeldung ist der Versuch, eine Zeichenfolge als Element in einem Array vom Typ zu verwenden float:

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

Das ist es, was Sie entsprechend Ihrer Bearbeitung versuchen. Wenn Sie wirklich ein NumPy-Array haben möchten, das sowohl Zeichenfolgen als auch Floats enthält, können Sie den Typ dtype verwenden object, mit dem das Array beliebige Python-Objekte enthalten kann:

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

Ohne zu wissen, was Ihr Code leisten soll, kann ich nicht beurteilen, ob Sie dies wünschen.

Sven Marnach
quelle
1
Danke, aber ich denke nicht, dass das die Antwort ist. Ich habe den Inhalt des Arrays hinzugefügt, wenn es den obigen Fehler auslöst. Und es scheint mir, dass es eine Box ist, wenn ich es in den Notizblock einfüge und es Zeile für Zeile untersuche. Irgendwelche anderen Ideen?
MedicalMath
2
Ihre Bearbeitung scheint mein Problem gelöst zu haben. Ich musste das Objekt dtype = setzen. Vielen Dank.
MedicalMath
Diese Frage wurde vollständig beantwortet.
MedicalMath
Eine andere Möglichkeit könnte ein Problem in 1.9 sein, wenn ein Array von Objekten (nicht unbedingt Listen) erstellt wird, die __getitem__wie hier angegeben implementiert werden: github.com/numpy/numpy/issues/5100
schneidiger
47

Der Python ValueError:

ValueError: setting an array element with a sequence.

Bedeutet genau das, was darin steht: Sie versuchen, eine Folge von Zahlen in einen einzelnen Zahlenschlitz zu packen. Es kann unter verschiedenen Umständen geworfen werden.

1. Wenn Sie ein Python-Tupel oder eine Python-Liste übergeben, die als numpy-Array-Element interpretiert werden soll:

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. Indem Sie versuchen, eine Numpy-Array-Länge> 1 in ein Numpy-Array-Element zu packen:

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

Ein Numpy-Array wird erstellt, und Numpy weiß nicht, wie mehrwertige Tupel oder Arrays in Einzelelement-Slots gepackt werden sollen. Es erwartet, dass alles, was Sie ihm geben, zu einer einzelnen Zahl ausgewertet wird. Wenn dies nicht der Fall ist, antwortet Numpy, dass es nicht weiß, wie ein Array-Element mit einer Sequenz festgelegt werden soll.

Eric Leschinski
quelle
sehr schöne Erklärung
Tejas Shetty
15

In meinem Fall habe ich diesen Fehler in Tensorflow erhalten. Grund war, dass ich versucht habe, ein Array mit unterschiedlicher Länge oder Sequenzen zu füttern:

Beispiel:

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)

Und wenn mein Array ist:

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

Dann bekomme ich Fehler:

ValueError: setting an array element with a sequence.

aber wenn ich polster mache dann:

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

Jetzt geht es.

Aaditya Ura
quelle
Ich habe pyCUDA verwendet und versehentlich ein gpuarray- Element dem numpy-Array zugewiesen. Ich habe den gleichen Fehler bekommen.
Tirtha R
@Aaditya Ura, wie man eine solche Polsterung durchführt, können Sie etwas verweisen?
Pari
7

Für diejenigen, die Probleme mit ähnlichen Problemen in Numpy haben, wäre eine sehr einfache Lösung:

Definieren dtype=objectbeim Definieren eines Arrays zum Zuweisen von Werten. zum Beispiel:

out = np.empty_like(lil_img, dtype=object)
Adam Liu
quelle
3
Wie unterscheidet es sich von einem EditTeil der akzeptierten Antwort?
11 जयते
Lief wie am Schnürchen!
Mcagriardic
5

In meinem Fall war das Problem ein anderes. Ich habe versucht, Listen von Listen von int in Array zu konvertieren. Das Problem war, dass es eine Liste mit einer anderen Länge als andere gab. Wenn Sie es beweisen wollen, müssen Sie Folgendes tun:

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

In meinem Fall betrug die Längenreferenz 560.

Andrés M. Jiménez
quelle
2

In meinem Fall lag das Problem bei einem Streudiagramm eines Datenrahmens 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)
Max Kleiner
quelle
Eine weitere Erklärung wäre schön.
Tejas Shetty
1
Der Wertefehler bedeutet, dass wir versuchen, ein n-Element-Array (eine Sequenz) in einen einzelnen Zahlenschlitz zu laden, der nur einen Float hat. Daher versuchen Sie, ein Array-Element mit einer Sequenz festzulegen. Mit .toarray () vergrößern wir es auf ein Array von Sequenzen. toarray () gibt ein ndarray zurück;
Max Kleiner