ValueError: การตั้งค่าองค์ประกอบอาร์เรย์ด้วยลำดับ


183

รหัส 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()

แสดงข้อผิดพลาดนี้:

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.

ทุกคนสามารถแสดงให้ฉันเห็นสิ่งที่ต้องทำเพื่อแก้ไขปัญหาในรหัสที่ใช้งานไม่ได้ข้างต้นเพื่อที่จะหยุดการโยนข้อความแสดงข้อผิดพลาด?


แก้ไข: ฉันได้สั่งพิมพ์เพื่อรับเนื้อหาของเมทริกซ์และนี่คือสิ่งที่มันพิมพ์ออกมา:

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

ดูเหมือนว่าฉันจะมีเมทริกซ์คอลัมน์ 5 แถวคูณ 13 คอลัมน์แม้ว่าจำนวนแถวจะแปรผันเมื่อข้อมูลต่าง ๆ ถูกเรียกใช้ผ่านสคริปต์ ด้วยข้อมูลเดียวกันนี้ที่ฉันเพิ่มเข้าไป

แก้ไข 2 : อย่างไรก็ตามสคริปต์กำลังโยนข้อผิดพลาด ดังนั้นฉันไม่คิดว่าความคิดของคุณจะอธิบายปัญหาที่เกิดขึ้นที่นี่ ขอบคุณค่ะ ความคิดอื่น ๆ ?


แก้ไข 3:

FYI หากฉันแทนที่รหัสบรรทัดปัญหานี้:

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

ด้วยสิ่งนี้แทน:

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

จากนั้นส่วนของสคริปต์จะทำงานได้ดีโดยไม่เกิดข้อผิดพลาด แต่จากนั้นโค้ดบรรทัดนี้จะเลื่อนลงไปอีก:

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

โยนข้อผิดพลาดนี้:

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

ดังนั้นคุณจะเห็นว่าฉันต้องระบุชนิดข้อมูลเพื่อให้สามารถใช้ ylim ใน matplotlib ได้ แต่ยังระบุประเภทข้อมูลกำลังขว้างปาข้อความแสดงข้อผิดพลาดที่เริ่มต้นโพสต์นี้


มีคนต้องการลบรายละเอียดที่ไม่เกี่ยวข้องทั้งหมดออกจากคำถามนี้ไหม
Chris_Rands

คำตอบ:


254

จากรหัสที่คุณแสดงให้เราเห็นสิ่งเดียวที่เราสามารถบอกได้คือคุณกำลังพยายามสร้างอาร์เรย์จากรายการที่ไม่ได้มีรูปร่างเหมือนอาเรย์หลายมิติ ตัวอย่างเช่น

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

หรือ

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

จะให้ข้อความแสดงข้อผิดพลาดนี้เนื่องจากรูปร่างของรายการอินพุตไม่ใช่ "กล่อง" ทั่วไป "ที่สามารถเปลี่ยนเป็นอาร์เรย์หลายมิติได้ ดังนั้นอาจUnFilteredDuringExSummaryOfMeansArrayประกอบด้วยลำดับของความยาวต่างกัน

แก้ไข : สาเหตุอื่นที่เป็นไปได้สำหรับข้อความแสดงข้อผิดพลาดนี้กำลังพยายามใช้สตริงเป็นองค์ประกอบในอาร์เรย์ประเภทfloat:

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

นั่นคือสิ่งที่คุณพยายามทำตามการแก้ไขของคุณ หากคุณต้องการให้มีอาร์เรย์ NumPy ที่มีทั้งสตริงและลอยคุณสามารถใช้ dtype objectซึ่งเปิดใช้งานอาร์เรย์เพื่อเก็บวัตถุ Python ตามอำเภอใจ:

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

หากไม่ทราบว่ารหัสของคุณจะสำเร็จฉันไม่สามารถตัดสินว่านี่คือสิ่งที่คุณต้องการ


1
ขอบคุณ แต่ฉันไม่คิดว่านั่นคือคำตอบ ฉันได้เพิ่มเนื้อหาของอาร์เรย์เมื่อมันโยนข้อผิดพลาดด้านบน และสำหรับฉันมันดูเหมือนว่าเป็นกล่องเมื่อฉันวางมันลงใน Notepad และตรวจสอบมันทีละบรรทัด ความคิดอื่น ๆ ?
MedicalMath

2
ดูเหมือนว่าการแก้ไขของคุณจะแก้ไขปัญหาของฉันได้ ฉันต้องการตั้งค่าวัตถุ dtype = ขอบคุณมาก.
MedicalMath

คำถามนี้ได้รับคำตอบอย่างสมบูรณ์
MedicalMath

ความเป็นไปได้อีกอย่างหนึ่งอาจเป็นปัญหาใน 1.9 เมื่อสร้างอาร์เรย์ของวัตถุ (ไม่จำเป็นต้องมีรายการ) ที่ใช้งาน__getitem__ตามที่ระบุไว้ที่นี่: github.com/numpy/numpy/issues/5100
dashesy

47

Python ValueError:

ValueError: setting an array element with a sequence.

หมายถึงสิ่งที่มันบอกว่าคุณกำลังพยายามที่จะยัดลำดับของตัวเลขลงในช่องหมายเลขเดียว มันสามารถโยนในสถานการณ์ต่าง ๆ

1. เมื่อคุณส่ง python tuple หรือรายการเพื่อตีความเป็นองค์ประกอบอาร์เรย์ 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. โดยพยายามยัดความยาวอาร์เรย์ numpy> 1 ลงในองค์ประกอบอาร์เรย์ 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

กำลังสร้างอาร์เรย์ numpy และ numpy ไม่ทราบวิธีบีบอัด tuples หรืออาร์เรย์ที่มีหลายค่าลงในสล็อตองค์ประกอบเดียว มันคาดหวังว่าสิ่งที่คุณให้ไว้เพื่อประเมินค่าเป็นจำนวนเดียวถ้าไม่เป็นเช่นนั้น Numpy จะตอบว่ามันไม่ทราบวิธีการตั้งค่าองค์ประกอบอาร์เรย์ด้วยลำดับ


คำอธิบายที่ดีมาก
Tejas Shetty

15

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้ใน Tensorflow เหตุผลคือฉันพยายามป้อนอาร์เรย์ด้วยความยาวหรือลำดับที่แตกต่างกัน:

ตัวอย่าง:

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)

และถ้าอาร์เรย์ของฉันคือ:

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

จากนั้นฉันจะได้รับข้อผิดพลาด:

ValueError: setting an array element with a sequence.

แต่ถ้าฉันทำ padding แล้ว:

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

ตอนนี้มันใช้งานได้


ฉันใช้ pyCUDA และมอบหมายองค์ประกอบgpuarrayให้กับอาร์เรย์ที่ไม่ตั้งใจ ฉันได้รับข้อผิดพลาดเดียวกัน
Tirtha R

@Aaditya Ura วิธีการดำเนินการแพ็ดดิ้งดังกล่าวคุณสามารถอ้างถึงบางสิ่งบางอย่าง?
pari

7

สำหรับผู้ที่มีปัญหากับปัญหาที่คล้ายกันใน Numpy วิธีแก้ปัญหาที่ง่ายมากคือ:

กำหนดdtype=objectเมื่อกำหนดอาร์เรย์สำหรับการกำหนดค่าให้กับมัน เช่น:

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

3
แตกต่างจากEditคำตอบที่ยอมรับอย่างไร
सत्यमेवजयते

ทำงานเหมือนจับใจ!
mcagriardic

5

ในกรณีของฉันปัญหานั้นเป็นอีกเรื่องหนึ่ง ฉันพยายามแปลงรายการของรายการ int เป็นอาร์เรย์ ปัญหาคือมีรายการหนึ่งรายการที่มีความยาวแตกต่างจากรายการอื่น หากคุณต้องการพิสูจน์ว่าคุณต้องทำ:

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

ในกรณีของฉันการอ้างอิงความยาวเท่ากับ 560


2

ในกรณีของฉันปัญหาเกิดขึ้นกับ scatterplot ของ 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)

คำอธิบายเพิ่มเติมบางอย่างจะดี
Tejas Shetty

1
ข้อผิดพลาดของค่าหมายความว่าเรากำลังพยายามโหลดอาร์เรย์ n องค์ประกอบ (ลำดับ) ลงในช่องหมายเลขเดียวซึ่งมีเพียงลอย ดังนั้นคุณกำลังพยายามตั้งค่าองค์ประกอบอาร์เรย์ด้วยลำดับ ด้วย. toarray () เราขยายมันไปยังอาร์เรย์ของลำดับ toarray () ส่งคืน ndarray;
Max Kleiner

0

เมื่อรูปร่างไม่ปกติหรือองค์ประกอบมีชนิดข้อมูลต่างกันdtypeอาร์กิวเมนต์ที่ส่งผ่านไปยัง np.array สามารถเป็นได้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 คำถามนี้เก่ามากและดูเหมือนว่าคำตอบของคุณจะซ้ำกันอย่างน้อยหนึ่งคำถาม หากคำตอบของคุณแตกต่างไปจากเดิมลองเพิ่มรายละเอียดเพิ่มเติมเพื่ออธิบาย
Jens Ehrich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.