ValueError: configurando um elemento da matriz com uma sequência


183

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

Lança esta mensagem de erro:

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.

Alguém pode me mostrar o que fazer para corrigir o problema no código quebrado acima, para que ele pare de lançar uma mensagem de erro?


EDIT: Eu fiz um comando de impressão para obter o conteúdo da matriz, e é isso que foi impresso:

UnFilteredDuringExSummaryOfMeansArray é:

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

Parece uma matriz de 5 linhas por 13 colunas para mim, embora o número de linhas seja variável quando dados diferentes são executados pelo script. Com esses mesmos dados que estou adicionando.

EDIT 2 : No entanto, o script está lançando um erro. Portanto, não acho que sua ideia explique o problema que está acontecendo aqui. Obrigado mesmo assim. Alguma outra ideia?


EDIT 3:

Para sua informação, se eu substituir esta linha de código problemática:

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

com isso:

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

Em seguida, essa seção do script funciona bem sem gerar um erro, mas essa linha de código fica mais abaixo:

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

Lança este erro:

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

Portanto, você pode ver que preciso especificar o tipo de dados para poder usar o ylim no matplotlib, mas especificar o tipo de dados está lançando a mensagem de erro que iniciou esta postagem.


alguém deseja remover todos os detalhes irrelevantes desta pergunta?
Chris_Rands

Respostas:


254

Pelo código que você nos mostrou, a única coisa que podemos dizer é que você está tentando criar uma matriz a partir de uma lista que não tem o formato de uma matriz multidimensional. Por exemplo

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

ou

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

gerará essa mensagem de erro, porque o formato da lista de entrada não é uma "caixa" (generalizada) que pode ser transformada em uma matriz multidimensional. Então provavelmente UnFilteredDuringExSummaryOfMeansArraycontém seqüências de diferentes comprimentos.

Edit : Outra causa possível para esta mensagem de erro está tentando usar uma string como um elemento em uma matriz do tipo float:

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

É isso que você está tentando de acordo com a sua edição. Se você realmente deseja ter um array NumPy contendo strings e floats, você pode usar o dtype object, que permite que o array armazene objetos Python arbitrários:

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

Sem saber o que seu código deve realizar, não posso julgar se é isso que você deseja.


1
Obrigado, mas não acho que essa seja a resposta. Eu adicionei o conteúdo da matriz quando lança o erro acima. E parece-me que é uma caixa quando colo no bloco de notas e o examino linha por linha. Alguma outra ideia?
MedicalMath

2
Sua edição parece ter resolvido meu problema. Eu precisava definir o dtype = objeto. Muito obrigado.
MedicalMath

Esta pergunta foi completamente respondida.
MedicalMath

Outra possibilidade poderia ser um problema em 1,9 quando a construção de uma matriz de objetos (não necessariamente listas) que implementam __getitem__conforme especificado aqui: github.com/numpy/numpy/issues/5100
dashesy

47

O ValueError do Python:

ValueError: setting an array element with a sequence.

Significa exatamente o que diz: você está tentando inserir uma sequência de números em um único slot de número. Pode ser lançado sob várias circunstâncias.

1. Quando você passa uma tupla ou lista python para ser interpretada como um 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. Tentando compactar um comprimento numpy numérico> 1 em um elemento numpy numérico:

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

Um array numpy está sendo criado e o numpy não sabe como agrupar tuplas ou matrizes de valores múltiplos em slots de elemento único. Ele espera que seja avaliado o que você avaliar para um único número; caso contrário, o Numpy responderá que não sabe como definir um elemento da matriz com uma sequência.


explicação muito agradável
Tejas Shetty

15

No meu caso, recebi esse erro no Tensorflow, a razão pela qual eu estava tentando alimentar uma matriz com diferentes comprimentos ou sequências:

exemplo:

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)

E se minha matriz for:

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

Então eu receberei o erro:

ValueError: setting an array element with a sequence.

mas se eu fizer preenchimento então:

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

Agora está funcionando.


Eu estava usando pyCUDA e acidentalmente atribui um elemento gpuarray à matriz numpy. Eu recebi o mesmo erro.
Tirtha R

@Aaditya Ura, como realizar tal preenchimento, você pode se referir a algo?
pari

7

para aqueles que estão tendo problemas com problemas semelhantes no Numpy, uma solução muito simples seria:

definindo dtype=objectao definir uma matriz para atribuir valores a ela. por exemplo:

out = np.empty_like(lil_img, dtype=object)

3
Como é diferente de Editparte da resposta aceita?
सत्यमेव जयते

Trabalhou como um encanto!
Mcagriardic

5

No meu caso, o problema era outro. Eu estava tentando converter listas de listas de int para matriz. O problema era que havia uma lista com um comprimento diferente das outras. Se você quiser provar isso, deve fazer:

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

No meu caso, a referência de comprimento era 560.


2

No meu caso, o problema estava com um gráfico de dispersão de um 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)

Mais alguma explicação seria legal.
Tejas Shetty

1
O erro de valor significa que estamos tentando carregar uma matriz de n elementos (sequência) em um slot de número único que possui apenas um número flutuante. Portanto, você está tentando definir um elemento de matriz com uma sequência. Com .toarray (), aumentamos para uma matriz de sequência. toarray () retorna um ndarray;
Max Kleiner

0

Quando a forma não é regular ou os elementos têm tipos de dados diferentes, o dtypeargumento passado para np.array somente pode ser 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

``


Bem-vindo ao SO. Esta pergunta é muito antiga e parece que sua resposta duplica pelo menos uma das outras. Se sua resposta for de fato diferente, tente adicionar mais alguns detalhes que explicam como.
Jens Ehrich
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.