ValueError: ustawienie elementu tablicy za pomocą sekwencji

183

Ten kod 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()

Zgłasza ten komunikat o błędzie:

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.

Czy ktoś może mi pokazać, co mam zrobić, aby rozwiązać problem z uszkodzonego kodu powyżej, aby przestał wyświetlać komunikat o błędzie?


EDYCJA: Zrobiłem polecenie drukowania, aby uzyskać zawartość matrycy, i oto, co wydrukowało:

UnFilteredDuringExSummaryOfMeansArray to:

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

Wygląda mi na matrycę 5 wierszy na 13 kolumn, chociaż liczba wierszy jest zmienna, gdy różne dane są uruchamiane przez skrypt. Z tymi samymi danymi, które dodam w tym.

EDYCJA 2 : Jednak skrypt zgłasza błąd. Nie sądzę więc, aby twój pomysł wyjaśniał występujący tutaj problem. Ale dziękuję. Jakieś inne pomysły?


EDYCJA 3:

Do Twojej wiadomości, jeśli zastąpię ten wiersz kodu problemu:

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

z tym zamiast tego:

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

Następnie ta sekcja skryptu działa dobrze bez zgłaszania błędu, ale następnie ten wiersz kodu znajduje się poniżej:

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

Zgłasza ten błąd:

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

Widać więc, że muszę określić typ danych, aby móc używać ylim w matplotlib, ale określenie typu danych powoduje wyświetlenie komunikatu o błędzie, który zainicjował ten post.

MedicalMath
źródło
czy ktoś chce usunąć wszystkie nieistotne szczegóły z tego pytania?
Chris_Rands

Odpowiedzi:

254

Z kodu, który nam pokazałeś, jedyne, co możemy powiedzieć, to to, że próbujesz utworzyć tablicę z listy, która nie ma kształtu wielowymiarowego. Na przykład

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

lub

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

wyświetli ten komunikat o błędzie, ponieważ kształt listy danych wejściowych nie jest (uogólnionym) „pudełkiem”, które można przekształcić w tablicę wielowymiarową. Prawdopodobnie UnFilteredDuringExSummaryOfMeansArrayzawiera sekwencje o różnych długościach.

Edycja : Inną możliwą przyczyną tego komunikatu o błędzie jest próba użycia ciągu jako elementu w tablicy typu float:

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

Właśnie tego próbujesz zgodnie ze swoją edycją. Jeśli naprawdę chcesz mieć tablicę NumPy zawierającą zarówno łańcuchy, jak i zmiennoprzecinkowe, możesz użyć dtype object, który umożliwia tablicy przechowywanie dowolnych obiektów Python:

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

Nie wiedząc, co osiągnie Twój kod, nie mogę ocenić, czy tego właśnie chcesz.

Sven Marnach
źródło
1
Dziękuję, ale nie sądzę, że taka jest odpowiedź. Dodałem zawartość tablicy, gdy wyrzuca błąd powyżej. I wydaje mi się, że jest to pudełko, kiedy wklejam je do notatnika i sprawdzam je linia po linii. Jakieś inne pomysły?
MedicalMath,
2
Twoja edycja wydaje się rozwiązać mój problem. Musiałem ustawić obiekt dtype =. Dziękuję Ci bardzo.
MedicalMath
Odpowiedź na to pytanie jest kompletna.
MedicalMath
Inną możliwością może być problem w wersji 1.9 podczas budowania tablicy obiektów (niekoniecznie list), które implementują się __getitem__tak, jak określono tutaj: github.com/numpy/numpy/issues/5100
dashy
47

Python ValueError:

ValueError: setting an array element with a sequence.

Oznacza to dokładnie to, co mówi, próbujesz wcisnąć sekwencję liczb w pojedynczy przedział liczbowy. Może być rzucany w różnych okolicznościach.

1. Gdy przekazujesz krotkę lub listę pythonową, które mają być interpretowane jako element tablicy 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. Próbując wcisnąć tablicę numpy o długości> 1 w element tablicy 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

Tworzona jest tablica numpy, a numpy nie wie, jak wcisnąć krotki lub tablice wielowartościowe w gniazda pojedynczych elementów. Oczekuje, że wszystko, co podasz, zostanie ocenione na jedną liczbę, jeśli nie, Numpy odpowiada, że ​​nie wie, jak ustawić element tablicy za pomocą sekwencji.

Eric Leschinski
źródło
bardzo ładne wyjaśnienie
Tejas Shetty
15

W moim przypadku wystąpił błąd w Tensorflow. Przyczyną było, że próbowałem nakarmić tablicę o innej długości lub sekwencji:

przykład:

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)

A jeśli moja tablica to:

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

Wtedy dostanę błąd:

ValueError: setting an array element with a sequence.

ale jeśli zrobię padding, wtedy:

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

Teraz działa.

Aaditya Ura
źródło
I był przy pyCUDA przypadkowo przypisany gpuarray elementu do numpy tablicy. Mam ten sam błąd.
Tirtha R
@Aaditya Ura, jak przeprowadzić takie wypełnienie, czy możesz coś skierować?
pari
7

dla tych, którzy mają problemy z podobnymi problemami w Numpy, bardzo prostym rozwiązaniem byłoby:

definiowanie dtype=objectpodczas definiowania tablicy do przypisywania jej wartości. na przykład:

out = np.empty_like(lil_img, dtype=object)
Adam Liu
źródło
3
Czym różni się od Editczęści przyjętej odpowiedzi?
सत्यमेव जयते
Działa jak urok!
mcagriardic,
5

W moim przypadku problem był inny. Próbowałem przekonwertować listy list int na tablicę. Problem polegał na tym, że była jedna lista o innej długości niż inne. Jeśli chcesz to udowodnić, musisz:

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

W moim przypadku referencyjna długość wynosiła 560.

Andrés M. Jiménez
źródło
2

W moim przypadku problemem był wykres rozrzutu ramki danych 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
źródło
Przydałoby się więcej wyjaśnień.
Tejas Shetty
1
Błąd wartości oznacza, że ​​próbujemy załadować tablicę n-elementową (sekwencję) do pojedynczego przedziału liczbowego, który ma tylko liczbę zmiennoprzecinkową. Dlatego próbujesz ustawić element tablicy za pomocą sekwencji. Za pomocą .toarray () powiększamy go do tablicy sekwencji. toarray () zwraca ndarray;
Max Kleiner,
0

Gdy kształt nie jest regularny lub elementy mają różne typy danych, dtypeargument przekazywany tylko do np.array może być 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
źródło
Witamy w SO. To pytanie jest bardzo stare i wygląda na to, że twoja odpowiedź powiela co najmniej jedno z pozostałych. Jeśli Twoja odpowiedź jest inna, spróbuj dodać więcej szczegółów wyjaśniających, w jaki sposób.
Jens Ehrich