ValueError: bir dizi elemanını bir dizi ile ayarlama

Bu Python kodu:

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

Bu hata mesajını atar:

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.

Hata mesajı vermeyi durdurması için yukarıdaki bozuk koddaki sorunu düzeltmek için ne yapmam gerektiğini gösterebilir misiniz?


EDIT: Matrisin içeriğini almak için bir print komutu verdim ve bu çıktıyı aldım:

UnFilteredDuringExSummaryOfMeansArray'dir:

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

Bana 5 satıra 13 sütunlu bir matris gibi göründü, ancak farklı veriler komut dosyasında çalıştırıldığında satır sayısı değişkenlik gösteriyor. Buna eklediğim aynı verilerle.

EDIT 2: Ancak, komut dosyası bir hata veriyor. Bu yüzden fikrinizin burada meydana gelen sorunu açıkladığını düşünmüyorum. Yine de teşekkür ederim. Başka bir fikriniz var mı?


EDIT 3:

Bilginize, eğer bu sorunlu kod satırını değiştirirsem:

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

bunun yerine bununla:

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

Daha sonra kodun o bölümü hata vermeden sorunsuz çalışır, ancak daha sonra bu kod satırı satırın ilerisinde:

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

Bu hatayı atar:

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

Gördüğünüz gibi, matplotlib'de ylim'i kullanabilmek için veri türünü belirtmem gerekiyor, ancak veri türünü belirtmek bu yazıyı başlatan hata mesajını veriyor.

Çözüm

Bize gösterdiğiniz koddan söyleyebileceğimiz tek şey, çok boyutlu bir dizi gibi şekillendirilmemiş bir listeden bir dizi oluşturmaya çalıştığınızdır. Örneğin

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

veya

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

bu hata mesajını verecektir, çünkü girdi listesinin şekli çok boyutlu bir diziye dönüştürülebilen (genelleştirilmiş) bir "kutu" değildir. Yani muhtemelen UnFilteredDuringExSummaryOfMeansArray farklı uzunluklarda diziler içerir.

Edit: Bu hata mesajının bir diğer olası nedeni, float türündeki bir dizide eleman olarak bir dize kullanmaya çalışmaktır:

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

Düzenlemenize göre denediğiniz şey bu. Eğer gerçekten hem string hem de float içeren bir NumPy dizisine sahip olmak istiyorsanız, dizinin keyfi Python nesnelerini tutmasını sağlayan dtype object kullanabilirsiniz:

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

Kodunuzun neyi başaracağını bilmeden, istediğinizin bu olup olmadığına karar veremem.

Yorumlar (4)

Python ValueError:

ValueError: setting an array element with a sequence.

Tam olarak söylediği şey anlamına gelir, bir dizi sayıyı tek bir sayı yuvasına sıkıştırmaya çalışıyorsunuz. Çeşitli koşullar altında atılabilir.

1. Bir python tuple veya listesini bir numpy dizi elemanı olarak yorumlanmak üzere ilettiğinizde:

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. Bir numpy dizi uzunluğunu > 1 bir numpy dizi elemanına sıkıştırmaya çalışarak:

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

Bir numpy dizisi oluşturuluyor ve numpy, çok değerli tuple'ları veya dizileri tek eleman yuvalarına nasıl sıkıştıracağını bilmiyor. Ona verdiğiniz her şeyin tek bir sayıya değerlendirilmesini bekler, eğer değerlendirilmezse, Numpy bir dizi elemanını bir dizi ile nasıl ayarlayacağını bilmediğini söyler.

Yorumlar (0)

Benim durumumda sorun başkaydı. İnt listelerini diziye dönüştürmeye çalışıyordum. Sorun, diğerlerinden farklı uzunlukta bir liste olmasıydı. Eğer bunu kanıtlamak istiyorsanız, yapmalısınız:

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

Benim durumumda, uzunluk referansı 560 idi.

Yorumlar (0)