ValueError: establecer un elemento de matriz con una secuencia

183

Este código de 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()

Lanza este mensaje de error:

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.

¿Alguien puede mostrarme qué hacer para solucionar el problema en el código roto anterior para que deje de arrojar un mensaje de error?


EDITAR: hice un comando de impresión para obtener el contenido de la matriz, y esto es lo que imprimió:

UnFilteredDuringExSummaryOfMeansArray es:

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

A mí me parece una matriz de 5 filas por 13 columnas, aunque el número de filas es variable cuando se ejecutan diferentes datos a través del script. Con estos mismos datos que estoy agregando en esto.

EDIT 2 : Sin embargo, el script está arrojando un error. Así que no creo que su idea explique el problema que está sucediendo aquí. Gracias de cualquier forma. ¿Alguna otra idea?


EDITAR 3:

Para su información, si reemplazo esta línea de código problemática:

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

con esto en su lugar:

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

Entonces esa sección del script funciona bien sin arrojar un error, pero luego esta línea de código más adelante:

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

Lanza este error:

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

Entonces, puede ver que necesito especificar el tipo de datos para poder usar ylim en matplotlib, pero al especificar el tipo de datos, aparece el mensaje de error que inició esta publicación.

MedicalMath
fuente
¿Alguien quiere eliminar todos los detalles irrelevantes de esta pregunta?
Chris_Rands

Respuestas:

254

Del código que nos mostró, lo único que podemos decir es que está tratando de crear una matriz a partir de una lista que no tiene la forma de una matriz multidimensional. Por ejemplo

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

o

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

generará este mensaje de error, porque la forma de la lista de entrada no es una "caja" (generalizada) que se puede convertir en una matriz multidimensional. Entonces, probablemente UnFilteredDuringExSummaryOfMeansArraycontiene secuencias de diferentes longitudes.

Editar : Otra posible causa de este mensaje de error es intentar usar una cadena como elemento en una matriz de tipo float:

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

Eso es lo que está intentando según su edición. Si realmente desea tener una matriz NumPy que contenga cadenas y flotantes, puede usar el dtype object, que permite que la matriz contenga objetos arbitrarios de Python:

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

Sin saber qué logrará su código, no puedo juzgar si esto es lo que desea.

Sven Marnach
fuente
1
Gracias, pero no creo que esa sea la respuesta. He agregado el contenido de la matriz cuando arroja el error anterior. Y me parece que es un cuadro cuando lo pego en el bloc de notas y lo examino línea por línea. ¿Alguna otra idea?
MedicalMath
2
Su edición parece haber resuelto mi problema. Necesitaba establecer dtype = object. Muchas gracias.
MedicalMath
Esta pregunta ha sido completamente respondida.
MedicalMath
Otra posibilidad podría ser un problema en 1.9 al construir una matriz de objetos (no necesariamente listas) que se implementan __getitem__como se especifica aquí: github.com/numpy/numpy/issues/5100
guión
47

El Python ValueError:

ValueError: setting an array element with a sequence.

Significa exactamente lo que dice: estás tratando de agrupar una secuencia de números en una sola ranura numérica. Se puede lanzar bajo varias circunstancias.

1. Cuando pasa una tupla o lista de Python para que se interprete como un elemento de matriz 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. Al intentar meter una longitud de matriz numpy> 1 en un elemento de matriz 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

Se está creando una matriz numpy, y numpy no sabe cómo agrupar tuplas o matrices de valores múltiples en ranuras de elementos individuales. Espera que lo que sea que le des para evaluar a un solo número, si no lo hace, Numpy responde que no sabe cómo configurar un elemento de matriz con una secuencia.

Eric Leschinski
fuente
muy buena explicación
Tejas Shetty
15

En mi caso, recibí este error en Tensorflow, la razón fue que estaba tratando de alimentar una matriz con diferentes longitudes o secuencias:

ejemplo:

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)

Y si mi matriz es:

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

Entonces obtendré un error:

ValueError: setting an array element with a sequence.

pero si hago relleno entonces:

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

Ahora funciona.

Aaditya Ura
fuente
Estaba usando pyCUDA y accidentalmente asigné un elemento gpuarray a una matriz numpy. Tengo el mismo error.
Tirtha R
@Aaditya Ura, cómo llevar a cabo ese relleno, ¿puedes recomendar algo?
pari
7

Para aquellos que están teniendo problemas con problemas similares en Numpy, una solución muy simple sería:

definir dtype=objectal definir una matriz para asignarle valores. por ejemplo:

out = np.empty_like(lil_img, dtype=object)
Adam Liu
fuente
3
¿Cómo es diferente de Editparte de la respuesta aceptada?
जयते जयते
¡Trabajado como un encanto!
mcagriardic
5

En mi caso, el problema era otro. Intentaba convertir listas de listas de int a array. El problema era que había una lista con una longitud diferente a las demás. Si quieres probarlo, debes hacer:

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

En mi caso, la referencia de longitud fue 560.

Andrés M. Jiménez
fuente
2

En mi caso, el problema era con un diagrama de dispersión de un marco de datos 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
fuente
Alguna explicación más estaría bien.
Tejas Shetty
1
El error de valor significa que estamos tratando de cargar una matriz (secuencia) de n elementos en una sola ranura numérica que solo tiene un flotante. Por lo tanto, está tratando de establecer un elemento de matriz con una secuencia. Con .toarray () lo ampliamos a una matriz de secuencia. toarray () devuelve un ndarray;
Max Kleiner
0

Cuando la forma no es regular o los elementos tienen diferentes tipos de datos, el dtypeargumento pasado a np.array solo puede serlo 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
fuente
Bienvenido a SO. Esta pregunta es muy antigua y parece que su respuesta duplica al menos una de las otras. Si su respuesta es diferente, intente agregar más detalles que expliquen cómo.
Jens Ehrich