ValueError: nastavenie prvku poľa so sekvenciou

Tento kód jazyka 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()

vyhodí túto chybovú správu:

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.

Môže mi niekto ukázať, čo mám urobiť, aby som odstránil problém v nefunkčnom kóde vyššie, aby to prestalo hádzať chybovú správu?


EDIT: Urobil som príkaz print, aby som získal obsah matice, a toto mi to vypísalo:

UnFilteredDuringExSummaryOfMeansArray is:

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

Podľa mňa to vyzerá ako matica s 5 riadkami a 13 stĺpcami, hoci počet riadkov je premenlivý, keď sa skriptom prechádzajú rôzne údaje. S tými istými údajmi, ktoré pridávam v tomto.

EDIT 2: Skript však hádže chybu. Takže si nemyslím, že váš nápad vysvetľuje problém, ktorý sa tu vyskytuje. Napriek tomu vám ďakujem. Nejaké ďalšie nápady?


EDIT 3:

FYI, ak nahradím tento problémový riadok kódu:

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

týmto:

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

Potom táto časť skriptu funguje bezchybne bez vyhodenia chyby, ale potom tento riadok kódu ďalej v riadku:

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

Vyhodí túto chybu:

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

Takže vidíte, že musím špecifikovať dátový typ, aby som mohol použiť ylim v matplotlib, ale napriek tomu špecifikovanie dátového typu vyhodí chybovú správu, ktorá iniciovala tento príspevok.

Riešenie

Z kódu, ktorý ste nám ukázali, môžeme povedať len to, že sa snažíte vytvoriť pole zo zoznamu, ktorý nemá tvar viacrozmerného poľa. Napríklad

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

alebo

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

prinesie toto chybové hlásenie, pretože tvar vstupného zoznamu nie je (všeobecný) "box", ktorý možno premeniť na viacrozmerné pole. Takže pravdepodobne UnFilteredDuringExSummaryOfMeansArray obsahuje sekvencie rôznych dĺžok.

Edit: Ďalšou možnou príčinou tejto chybovej správy je pokus o použitie reťazca ako prvku v poli typu float:

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

O to sa podľa vašej úpravy pokúšate. Ak naozaj chcete mať pole NumPy obsahujúce reťazce aj floaty, môžete použiť dtype object, ktorý umožňuje, aby pole obsahovalo ľubovoľné objekty Pythonu:

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

Bez toho, aby som vedel, čo má váš kód dosiahnuť, nemôžem posúdiť, či je to to, čo chcete.

Komentáre (4)

Pythonovská chyba ValueError:

ValueError: setting an array element with a sequence.

Znamená presne to, čo hovorí, že sa snažíte vtesnať postupnosť čísel do jedného číselného slotu. Môže byť vyhodená za rôznych okolností.

1. Keď odovzdávate pythonovský tuple alebo zoznam, ktorý sa má interpretovať ako prvok poľa 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. Pri pokuse vtesnať prvok numpy poľa dĺžky > 1 do prvku numpy poľa:

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

Vytvára sa numpy pole a numpy nevie'vtesnať viachodnotové tuply alebo polia do slotov pre jeden prvok. Očakáva, že čokoľvek mu zadáte, vyhodnotí sa ako jedno číslo, ak sa tak nestane, Numpy odpovie, že nevie, ako nastaviť prvok poľa s postupnosťou.

Komentáre (0)

V mojom prípade bol problém iný. Snažil som sa konvertovať zoznamy int na pole. Problém bol v tom, že jeden zoznam mal inú dĺžku ako ostatné. Ak to chcete dokázať, musíte to urobiť:

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

V mojom prípade bol odkaz na dĺžku 560.

Komentáre (0)