Numpy ValueError: paramétrage d'un élément de tableau avec une séquence. Ce message peut apparaître sans l'existant d'une séquence?

Pourquoi j'obtiens ce message d'erreur? ValueError: définir 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
demandé sur DSM 2012-11-09 18:55:05

6 réponses

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à -- le message d'erreur est d'essayer de vous dire exactement quel est le problème. Ne pensez pas que c'est une erreur cryptique, c'est juste une phrase. Quelle ligne est à l'origine du problème?

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

cette ligne essaie de définir le ith élément de kOUT ce que func(TempLAke[i], Z) retourne. En regardant l' i=0 cas:

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 à 4 éléments dans kOUT[0] qui n'a qu'un flotteur. Donc, 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)).

Probablement func n'est-ce pas faire ce que vous voulez, mais je ne suis pas sûr de ce que vous avez vraiment envie de faire (et n'oubliez pas que vous pouvez généralement utiliser vectorisé opérations de type A*B plutôt que d'une boucle dans numpy. Cela devrait expliquer le problème, de toute façon.

39
répondu DSM 2012-11-09 16:26:34

il est dommage que les deux réponses résolvent le problème mais n'ont pas donné de conclusion pour le résoudre. Nous allons voir 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 montre que vous mettez le ième élément de kOUT (dtype:int) dans un tableau, chaque élément de kOUT est juste un élément int, ne peut pas pointer vers un autre type de données, vous devriez changer la déclaration pour changer le type de données du kOUT. Par exemple, de la forme:

modifier la déclaration ci-dessous:

kOUT = np.zeros(N + 1)

en:

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 vous aider.

16
répondu Johnny Wong 2017-11-20 11:28:04

je crois que les tableaux python admettent juste des valeurs. Alors convertissez - le en liste:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
3
répondu Luis Renato 2015-06-26 00:18:59
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 boucle , juste vectoriser cependant lire ci-dessous les notes de l'scipy de la documentation : https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

la fonction vectorize est fournie principalement pour la commodité, et non pour la performance. La mise en œuvre est essentiellement une boucle.

Si otypes n'est pas spécifié, puis un appel à la fonction avec le premier argument sera utilisé pour déterminer le nombre des sorties. Les résultats de cet appel seront mis en cache si cache est True pour empêcher d'appeler la fonction deux fois. Cependant, pour implémenter le cache, la fonction originale doit être enveloppée, ce qui ralentira les appels ultérieurs, alors ne faites cela que si votre fonction est chère.

1
répondu Ahalya L 2017-08-09 17:54:45

Pour mettre une séquence ou d'un autre tableau numpy dans un tableau numpy, Il suffit de changer cette ligne:

kOUT=np.zeros(N+1)

à:

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

Ou:

kOUT=np.zeros((N+1), object)
0
répondu Oluwasegun Somefun 2017-12-21 06:51:48

KOUT[i] est un élément unique d'une liste. Mais vous assignez une liste à cet élément. votre func génère une liste.

-1
répondu Shahzamal 2017-06-16 09:39:58