it-swarm.com.de

Numpy ValueError: Setzen eines Array-Elements mit einer Sequenz. Diese Nachricht kann ohne das Vorhandensein einer Sequenz erscheinen?

Warum erhalte ich diese Fehlermeldung? ValueError: Setzen eines Array-Elements mit einer Sequenz. Vielen Dank

Z=np.array([1.0,1.0,1.0,1.0])  

def func(TempLake,Z):
    A=TempLake
    B=Z
    return A*B

Nlayers=Z.size
N=3
TempLake=np.zeros((N+1,Nlayers))

kOUT=np.zeros(N+1)
for i in xrange(N):
    kOUT[i]=func(TempLake[i],Z)
23
user1419224

Sie erhalten die Fehlermeldung

ValueError: setting an array element with a sequence.

weil Sie versuchen, ein Array-Element mit einer Sequenz festzulegen. Ich versuche nicht, niedlich zu sein - die Fehlermeldung versucht, Ihnen genau zu sagen, was das Problem ist. Betrachten Sie es nicht als einen kryptischen Fehler, es ist einfach ein Satz. Welche Zeile gibt das Problem?

kOUT[i]=func(TempLake[i],Z)

Diese Zeile versucht, das ith-Element von kOUT auf das zu setzen, was func(TempLAke[i], Z) zurückgibt. Betrachten Sie den i=0 Fall:

In [39]: kOUT[0]
Out[39]: 0.0

In [40]: func(TempLake[0], Z)
Out[40]: array([ 0.,  0.,  0.,  0.])

Sie versuchen, ein 4-Element-Array in kOUT[0] zu laden, das nur über einen Float verfügt. Daher versuchen Sie, ein Array-Element (die linke Seite kOUT[i]) mit einer Sequenz (die rechte Seite func(TempLake[i], Z)) festzulegen.

Wahrscheinlich macht func nicht das, was Sie wollen, aber ich bin mir nicht sicher, was Sie wirklich tun wollten (und vergessen Sie nicht, dass Sie normalerweise vektorisierte Operationen wie A * B verwenden können, anstatt sich in numpy zu schleifen.) Problem trotzdem. 

40
DSM

Es ist schade, dass beide Antworten das Problem herausfinden, aber keine Schlußfolgerung für die Lösung dieses Problems geben.

Z = np.array([1.0, 1.0, 1.0, 1.0])  

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B
Nlayers = Z.size
N = 3
TempLake = np.zeros((N+1, Nlayers))
kOUT = np.zeros(N + 1)

for i in xrange(N):
    # store the i-th result of
    # function "func" in i-th item in kOUT
    kOUT[i] = func(TempLake[i], Z)

Der Fehler zeigt an, dass Sie das i-te Element von kOUT (dtype: int) in einem Array festlegen. Jedes Element in kOUT ist nur ein int-Element. Es kann nicht auf einen anderen Datentyp verweisen Zum Beispiel:

Ändern Sie die folgende Anweisung:

kOUT = np.zeros(N + 1)

in:

kOUT = np.zeros(N + 1, dtype=object)

oder:

kOUT = np.zeros((N + 1, N + 1))

Alle code:

import numpy as np
Z = np.array([1.0, 1.0, 1.0, 1.0])

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B

Nlayers = Z.size
N = 3
TempLake = np.zeros((N + 1, Nlayers))

kOUT = np.zeros(N + 1, dtype=object)
for i in xrange(N):
    kOUT[i] = func(TempLake[i], Z)

Ich hoffe es kann dir helfen.

18
Johnny Wong

Ich glaube, dass Python-Arrays nur Werte zulassen. Also konvertiere es in die Liste:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
3
Luis Renato
Z=np.array([1.0,1.0,1.0,1.0])  

def func(TempLake,Z):
    A=TempLake
    B=Z
    return A*B
Nlayers=Z.size
N=3
TempLake=np.zeros((N+1,Nlayers))
kOUT=np.vectorize(func)(TempLake,Z)

Dies funktioniert auch, anstatt eine Schleife zu erstellen, aber lesen Sie die folgenden Hinweise aus der Scipy-Dokumentation: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

Die Vektorisierungsfunktion dient in erster Linie dem Komfort und nicht der Leistung. Die Implementierung ist im Wesentlichen eine for-Schleife.

Wenn otypes nicht angegeben ist, wird ein Aufruf der Funktion mit dem ersten Argument verwendet, um die Anzahl der Ausgaben zu bestimmen. Die Ergebnisse dieses Aufrufs werden zwischengespeichert, wenn der Cache auf True gesetzt ist, damit die Funktion nicht zweimal aufgerufen wird. Um den Cache zu implementieren, muss die ursprüngliche Funktion umbrochen werden, was nachfolgende Aufrufe verlangsamt. Tun Sie dies also nur, wenn Ihre Funktion teuer ist.

1
Ahalya L

Um eine Sequenz oder ein anderes numpy-Array in ein numpy-Array zu setzen, ___. Ändern Sie einfach diese Zeile:

kOUT=np.zeros(N+1)

zu: 

kOUT=np.asarray([None]*(N+1))

Oder:

kOUT=np.zeros((N+1), object)
0