ValueError: définition d'un élément de tableau avec une séquence

183

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

Lance ce message d'erreur:

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.

Quelqu'un peut-il me montrer quoi faire pour résoudre le problème dans le code cassé ci-dessus afin qu'il cesse de lancer un message d'erreur?


EDIT: J'ai fait une commande d'impression pour obtenir le contenu de la matrice, et voici ce qu'elle a imprimé:

UnFilteredDuringExSummaryOfMeansArray est:

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

Cela ressemble à une matrice de 5 lignes par 13 colonnes pour moi, bien que le nombre de lignes soit variable lorsque différentes données sont exécutées dans le script. Avec ces mêmes données que j'ajoute.

EDIT 2 : Cependant, le script génère une erreur. Je ne pense donc pas que votre idée explique le problème qui se produit ici. Merci quand même. D'autres idées?


MODIFIER 3:

FYI, si je remplace cette ligne de code problématique:

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

avec ceci à la place:

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

Ensuite, cette section du script fonctionne correctement sans générer d'erreur, mais cette ligne de code plus loin dans la ligne:

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

Lève cette erreur:

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

Vous pouvez donc voir que je dois spécifier le type de données pour pouvoir utiliser ylim dans matplotlib, mais spécifier le type de données renvoie le message d'erreur à l'origine de ce message.

MédicalMath
la source
quelqu'un veut-il supprimer tous les détails non pertinents de cette question?
Chris_Rands

Réponses:

254

D'après le code que vous nous avez montré, la seule chose que nous pouvons dire est que vous essayez de créer un tableau à partir d'une liste qui n'a pas la forme d'un tableau multidimensionnel. Par exemple

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

ou

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

produira ce message d'erreur, car la forme de la liste d'entrée n'est pas une "boîte" (généralisée) qui peut être transformée en un tableau multidimensionnel. UnFilteredDuringExSummaryOfMeansArrayContient donc probablement des séquences de différentes longueurs.

Edit : Une autre cause possible de ce message d'erreur est d'essayer d'utiliser une chaîne comme élément dans un tableau de type float:

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

C'est ce que vous essayez selon votre modification. Si vous voulez vraiment avoir un tableau NumPy contenant à la fois des chaînes et des flottants, vous pouvez utiliser le dtype object, qui permet au tableau de contenir des objets Python arbitraires:

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

Sans savoir ce que votre code doit accomplir, je ne peux pas juger si c'est ce que vous voulez.

Sven Marnach
la source
1
Merci, mais je ne pense pas que ce soit la réponse. J'ai ajouté le contenu du tableau lorsqu'il lance l'erreur ci-dessus. Et il me semble que c'est une boîte lorsque je la colle dans le bloc-notes et que je l'examine ligne par ligne. D'autres idées?
MedicalMath
2
Votre modification semble avoir résolu mon problème. J'avais besoin de définir le dtype = object. Merci beaucoup.
MedicalMath
Cette question a reçu une réponse complète.
MedicalMath
Une autre possibilité pourrait être un problème dans la version 1.9 lors de la construction d'un tableau d'objets (pas nécessairement de listes) qui implémentent __getitem__comme spécifié ici: github.com/numpy/numpy/issues/5100
dashesy
47

Le ValueError Python:

ValueError: setting an array element with a sequence.

Cela signifie exactement ce qu'il dit, vous essayez d'entasser une séquence de nombres dans un seul emplacement numérique. Il peut être lancé dans diverses circonstances.

1. Lorsque vous transmettez un tuple ou une liste python à interpréter comme un élément de tableau 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. En essayant de regrouper une longueur de tableau numpy> 1 dans un élément de tableau 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

Un tableau numpy est en cours de création et numpy ne sait pas comment entasser des tuples ou des tableaux à plusieurs valeurs dans des emplacements d'élément unique. Il s'attend à ce que tout ce que vous lui donnez soit évalué à un seul nombre, si ce n'est pas le cas, Numpy répond qu'il ne sait pas comment définir un élément de tableau avec une séquence.

Eric Leschinski
la source
très belle explication
Tejas Shetty le
15

Dans mon cas, j'ai eu cette erreur dans Tensorflow, la raison était que j'essayais d'alimenter un tableau avec une longueur ou des séquences différentes:

exemple :

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)

Et si mon tableau est:

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

Ensuite, j'obtiendrai une erreur:

ValueError: setting an array element with a sequence.

mais si je fais du rembourrage alors:

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

Maintenant ça marche.

Aaditya Ura
la source
J'utilisais pyCUDA et affecté accidentellement un gpuarray élément tableau numpy. J'ai eu la même erreur.
Tirtha R
@Aaditya Ura, comment effectuer un tel rembourrage, pouvez-vous renvoyer quelque chose?
pari le
7

pour ceux qui ont des problèmes avec des problèmes similaires dans Numpy, une solution très simple serait:

définition dtype=objectlors de la définition d'un tableau pour lui attribuer des valeurs. par exemple:

out = np.empty_like(lil_img, dtype=object)
Adam Liu
la source
3
En quoi est-ce différent d'une Editpartie de la réponse acceptée.
सत्यमेव जयते
A travaillé comme un charme!
mcagriardic
5

Dans mon cas, le problème en était un autre. J'essayais de convertir des listes de listes d'int en tableau. Le problème était qu'il y avait une liste avec une longueur différente des autres. Si vous voulez le prouver, vous devez faire:

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

Dans mon cas, la longueur de référence était de 560.

Andrés M. Jiménez
la source
2

Dans mon cas, le problème était avec un nuage de points d'une dataframe 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
la source
Une explication supplémentaire serait bien.
Tejas Shetty le
1
L'erreur de valeur signifie que nous essayons de charger un tableau (séquence) de n éléments dans un seul emplacement numérique qui n'a qu'un flottant. Par conséquent, vous essayez de définir un élément de tableau avec une séquence. Avec .toarray (), nous l'agrandissons en un tableau de séquence. toarray () renvoie un ndarray;
Max Kleiner le
0

Lorsque la forme n'est pas régulière ou que les éléments ont des types de données différents, l' dtypeargument passé à np.array uniquement peut l'être 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

''

xiong cai
la source
Bienvenue à SO. Cette question est très ancienne et il semble que votre réponse duplique au moins l'une des autres. Si votre réponse est en fait différente, essayez d'ajouter des détails supplémentaires expliquant comment.
Jens Ehrich le