ValueError: dizi içeren bir dizi öğesini ayarlama


183

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.

Birisi bana hata kodu atma durur böylece yukarıdaki kırık koddaki sorunu düzeltmek için ne yapacağımı gösterebilir?


EDIT: Matris içeriğini almak için bir yazdırma komutu yaptım ve bu çıktı:

UnFilteredDuringExSummaryOfMeansArray şudur:

[['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ır 13 sütun matrisi gibi görünüyor, ancak komut dosyası üzerinden farklı veriler çalıştırıldığında satır sayısı değişkendir. Ben aynı veri ile bu ekliyorum.

EDIT 2 : Ancak, komut dosyası bir hata atıyor. Bu yüzden fikrinizin burada meydana gelen sorunu açıkladığını sanmıyorum. Yine de teşekkürler. Başka fikir var mı?


DÜZENLEME 3:

Bu sorun kod satırını değiştirirseniz FYI:

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

bunun yerine:

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

Sonra komut dosyasının bu bölümü hata atmadan iyi çalışır, ancak daha sonra bu kod satırı daha aşağıya doğru çalışır:

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

Yani matplotlib içinde ylim kullanabilmek için veri türünü belirtmem gerektiğini görebilirsiniz, ancak henüz veri türünü belirtmek bu yazıyı başlatan hata mesajını atıyor.


birisi ilgisiz tüm ayrıntıları bu sorudan kaldırmak istiyor mu?
Chris_Rands

Yanıtlar:


254

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

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

veya

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

giriş listesinin şekli çok boyutlu bir diziye dönüştürülebilen (genelleştirilmiş) bir "kutu" olmadığından bu hata iletisini verir. Yani muhtemelen UnFilteredDuringExSummaryOfMeansArrayfarklı uzunluklarda diziler içerir.

Düzenleme : Bu hata iletisinin bir başka olası nedeni, bir dizeyi öğe dizisinde öğe olarak kullanmaya çalışıyor float:

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

Düzenlemenize göre bunu deniyorsunuz. Gerçekten hem dizeleri hem de kayan noktaları içeren bir NumPy dizisine sahip olmak istiyorsanız object, dizinin rasgele Python nesnelerini tutmasını sağlayan dtype kullanabilirsiniz :

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

Kodunuzun ne başaracağını bilmeden, istediğiniz şey olup olmadığına karar veremem.


1
Teşekkür ederim, ama cevap olduğunu sanmıyorum. Yukarıdaki hatayı atarken dizinin içeriğini ekledim. Bana öyle geliyor ki, not defterine yapıştırıp satır satır incelediğimde bir kutu. Başka fikir var mı?
MedicalMath

2
Düzenlemeniz sorunumu çözmüş görünüyor. Ben dtype = nesne ayarlamak gerekiyordu. Çok teşekkür ederim.
MedicalMath

Bu soru tamamen cevaplandı.
MedicalMath

Başka bir olasılık, __getitem__burada belirtildiği gibi uygulanan bir nesne dizisi (zorunlu olarak listeler değil) oluştururken 1,9'da bir sorun olabilir : github.com/numpy/numpy/issues/5100
dashesy

47

Python ValueError:

ValueError: setting an array element with a sequence.

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

1. Numpy dizi öğesi olarak yorumlanacak bir python grubunu veya listeyi 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. Numpy dizi uzunluğunu> 1 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 tuplleri veya dizileri tek elemanlı yuvalara nasıl sıkıştıracağını bilmiyor. Verdiğiniz her şeyi tek bir sayıya değerlendirmesini bekler, eğer değilse Numpy, bir dizi öğesini bir dizi ile nasıl ayarlayacağını bilmediğini yanıtlar.


çok güzel açıklama
Tejas Shetty

15

Benim durumumda, Tensorflow'da bu Hatayı aldım, Nedeni farklı uzunluk veya dizilere sahip bir dizi beslemeye çalışıyordu:

misal :

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)

Ve benim dizilim ise:

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

Sonra hata alırsınız:

ValueError: setting an array element with a sequence.

ama eğer dolgu yapmak o zaman:

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

Şimdi çalışıyor.


PyCUDA kullanıyordum ve yanlışlıkla numpy dizisine bir gpuarray öğesi atadım . Aynı hatayı aldım.
Tirtha R

@Aaditya Ura, böyle bir dolgu nasıl yapılır, bir şey önerebilir misiniz?
pari

7

Numpy'de benzer problemlerle sorun yaşayanlar için çok basit bir çözüm:

tanımlama dtype=objecto değerleri tahsis ederek bir dizi tanımlarken. Örneğin:

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

3
EditKabul edilen cevabın bir bölümünden farkı nedir ?
जयते जयते

Bir cazibe gibi çalıştı!
mcagriardic

5

Benim durumumda, sorun başka bir şeydi. Diziye int listelerinin listesini dönüştürmeye çalışıyordum. Sorun, diğerlerinden farklı uzunlukta bir liste olmasıydı. Bunu kanıtlamak istiyorsanız, şunları yapmalısınız:

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

Benim durumumda, uzunluk referansı 560 idi.


2

Benim durumumda, sorun veri karesi X [] dağılım grafiği ile oldu:

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)

Biraz daha açıklama iyi olurdu.
Tejas Shetty

1
Değer hatası, yalnızca kayan noktalı tek sayı yuvasına bir n öğesi dizisi (sıra) yüklemeye çalıştığımız anlamına gelir. Bu nedenle, bir dizi içeren bir dizi öğesi ayarlamaya çalışıyorsunuz. .Toarray () ile onu bir dizi dizisine genişletiyoruz. toarray () bir ndarray döndürür;
Max Kleiner

0

Şekil normal değilse veya öğelerin farklı veri türleri varsa, dtypenp.array öğesine iletilen bağımsız değişken yalnızca olabilir 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

``


SO'ya hoş geldiniz. Bu soru çok eski ve cevabınız diğerlerinden en az birini kopyalıyor gibi görünüyor. Cevabınız aslında farklıysa, nasıl yapılacağını açıklayan daha fazla ayrıntı eklemeyi deneyin.
Jens Ehrich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.