web-dev-qa-db-fra.com

Numpy ValueError: définition d'un élément de tableau avec une séquence. Ce message peut-il apparaître sans l'existence d'une séquence?

Pourquoi ai-je ce message d'erreur? ValueError: définition d'un élément de tableau avec une séquence. Je vous remercie

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

Vous obtenez le message d'erreur

ValueError: setting an array element with a sequence.

parce que vous essayez de définir un élément de tableau avec une séquence. Je n'essaie pas d'être mignon, là-bas - le message d'erreur essaie de vous dire exactement quel est le problème. Ne le considérez pas comme une erreur cryptique, c'est simplement une phrase. Quelle ligne donne le problème?

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

Cette ligne tente de définir l’élément ith de kOUT à la valeur retournée par func(TempLAke[i], Z). En regardant le cas i=0:

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

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

Vous essayez de charger un tableau de 4 éléments dans kOUT[0] qui n'a qu'un float. Par conséquent, vous essayez de définir un élément de tableau (le côté gauche, kOUT[i]) avec une séquence (le côté droit, func(TempLake[i], Z)).

func ne fait probablement pas ce que vous voulez, mais je ne suis pas sûr de ce que vous souhaitiez réellement (et n'oubliez pas que vous pouvez généralement utiliser des opérations vectorisées telles que A * B plutôt que de boucler numpy.) Cela devrait expliquer la problème, de toute façon. 

40
DSM

Il est dommage que les deux réponses résolvent le problème mais ne donnent pas de conclusion pour résoudre ce problème… .. Voyons le code.

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)

L'erreur indique que vous définissez le ième élément de kOUT (dtype: int) dans un tableau. Chaque élément de kOUT est simplement un élément int, vous ne pouvez pas pointer sur un autre type de données. Vous devez modifier l'instruction pour modifier le type de données de kOUT. . Par exemple, comme:

Changer la déclaration ci-dessous:

kOUT = np.zeros(N + 1)

dans:

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

ou:

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

Tous les codes:

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)

J'espère que ça peut t'aider.

18
Johnny Wong

Je crois que les tableaux python admettent juste des valeurs. Alors convertissez-le en 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)

Cela fonctionne aussi, au lieu de boucler, vectorisez toutefois les notes ci-dessous de la documentation scipy: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

La fonction de vectorisation est fournie principalement pour des raisons de commodité et non de performances. L'implémentation est essentiellement une boucle for.

Si otypes n'est pas spécifié, un appel à la fonction avec le premier argument sera utilisé pour déterminer le nombre de sorties. Les résultats de cet appel seront mis en cache si cache est défini sur True afin d'éviter d'appeler la fonction deux fois. Toutefois, pour implémenter le cache, la fonction d'origine doit être encapsulée, ce qui ralentira les appels suivants. Ne le faites donc que si votre fonction est coûteuse.

1
Ahalya L

Pour placer une séquence ou un autre tableau numpy dans un tableau numpy, modifiez cette ligne:

kOUT=np.zeros(N+1)

à: 

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

Ou:

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