ValueError: mengatur elemen array dengan urutan

183

Kode Python ini:

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

Lemparkan pesan kesalahan ini:

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.

Adakah yang bisa menunjukkan kepada saya apa yang harus dilakukan untuk memperbaiki masalah pada kode yang rusak di atas sehingga berhenti membuang pesan kesalahan?


EDIT: Saya melakukan perintah cetak untuk mendapatkan isi dari matriks, dan inilah yang dicetak:

UnFilteredDuringExSummaryOfMeansArray adalah:

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

Sepertinya 5 baris dengan 13 kolom matriks bagi saya, meskipun jumlah baris adalah variabel ketika data berbeda dijalankan melalui skrip. Dengan data yang sama yang saya tambahkan ini.

EDIT 2 : Namun, skrip tersebut membuat kesalahan. Jadi saya tidak berpikir bahwa ide Anda menjelaskan masalah yang terjadi di sini. Terima kasih. Ada ide lain?


EDIT 3:

FYI, jika saya mengganti baris kode masalah ini:

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

dengan ini sebagai gantinya:

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

Kemudian bagian skrip itu berfungsi dengan baik tanpa menimbulkan kesalahan, tetapi kemudian baris kode ini semakin jauh ke bawah:

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

Lemparkan kesalahan ini:

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

Jadi Anda dapat melihat bahwa saya perlu menentukan tipe data agar dapat menggunakan ylim di matplotlib, tetapi belum menentukan tipe data melemparkan pesan kesalahan yang memprakarsai posting ini.

MedicalMath
sumber
apakah seseorang ingin menghapus semua detail yang tidak relevan dari pertanyaan ini?
Chris_Rands

Jawaban:

254

Dari kode yang Anda perlihatkan kepada kami, satu-satunya hal yang dapat kami katakan adalah bahwa Anda mencoba membuat array dari daftar yang tidak berbentuk seperti array multi-dimensi. Sebagai contoh

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

atau

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

akan menghasilkan pesan kesalahan ini, karena bentuk daftar input bukan "kotak" (umum) yang dapat diubah menjadi array multidimensi. Jadi mungkinUnFilteredDuringExSummaryOfMeansArray mengandung urutan panjang yang berbeda.

Sunting : Penyebab lain yang mungkin untuk pesan kesalahan ini adalah mencoba menggunakan string sebagai elemen dalam array tipe float:

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

Itulah yang Anda coba sesuai dengan hasil edit Anda. Jika Anda benar-benar ingin memiliki array NumPy yang berisi string dan float, Anda bisa menggunakan dtype object, yang memungkinkan array untuk menyimpan objek Python sewenang-wenang:

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

Tanpa mengetahui apa yang akan dicapai kode Anda, saya tidak dapat menilai apakah ini yang Anda inginkan.

Sven Marnach
sumber
1
Terima kasih, tapi saya rasa bukan itu jawabannya. Saya telah menambahkan konten array ketika melemparkan kesalahan di atas. Dan bagi saya itu adalah kotak ketika saya tempel ke notepad dan memeriksanya baris demi baris. Ada ide lain?
MedicalMath
2
Hasil edit Anda tampaknya telah menyelesaikan masalah saya. Saya perlu mengatur objek = dtype. Terima kasih banyak.
MedicalMath
Pertanyaan ini telah dijawab sepenuhnya.
MedicalMath
Kemungkinan lain bisa menjadi masalah di 1.9 ketika membangun array objek (tidak harus daftar) yang mengimplementasikan __getitem__sebagaimana ditentukan di sini: github.com/numpy/numpy/issues/5100
dash
47

The Python ValueError:

ValueError: setting an array element with a sequence.

Berarti persis seperti yang dikatakannya, Anda mencoba menjejalkan urutan angka ke dalam slot nomor tunggal. Itu bisa dilemparkan dalam berbagai keadaan.

1. Ketika Anda melewatkan tuple atau daftar python untuk ditafsirkan sebagai elemen array 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. Dengan mencoba menjejalkan panjang array numpy> 1 ke elemen array 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

Array numpy sedang dibuat, dan numpy tidak tahu bagaimana menjejalkan tuple multivalued atau array ke dalam slot elemen tunggal. Itu mengharapkan apa pun yang Anda berikan untuk mengevaluasi ke satu angka, jika tidak, Numpy menjawab bahwa ia tidak tahu cara mengatur elemen array dengan urutan.

Eric Leschinski
sumber
penjelasan yang sangat bagus
Tejas Shetty
15

Dalam kasus saya, saya mendapatkan Kesalahan ini di Tensorflow, Alasannya adalah saya mencoba memberi makan array dengan panjang atau urutan yang berbeda:

contoh:

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)

Dan jika array saya adalah:

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

Maka saya akan mendapatkan kesalahan:

ValueError: setting an array element with a sequence.

tetapi jika saya melakukan padding maka:

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

Sekarang berhasil.

Aaditya Ura
sumber
Saya menggunakan pyCUDA dan secara tidak sengaja menugaskan elemen gpuarray ke array numpy. Saya mendapat kesalahan yang sama.
Tirtha R
@Aaditya Ura, bagaimana melakukan padding seperti itu, dapatkah Anda merujuk sesuatu?
pari
7

bagi mereka yang mengalami masalah dengan masalah serupa di Numpy, solusi yang sangat sederhana adalah:

mendefinisikan dtype=objectsaat mendefinisikan array untuk menetapkan nilai padanya. misalnya:

out = np.empty_like(lil_img, dtype=object)
Adam Liu
sumber
3
Apa bedanya dengan Editbagian dari jawaban yang diterima.
सत्यमेव जयते
Bekerja seperti pesona!
mcagriardic
5

Dalam kasus saya, masalahnya adalah masalah lain. Saya mencoba mengubah daftar daftar int ke array. Masalahnya adalah ada satu daftar dengan panjang yang berbeda dari yang lain. Jika Anda ingin membuktikannya, Anda harus melakukan:

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

Dalam kasus saya, referensi panjangnya adalah 560.

Andrés M. Jiménez
sumber
2

Dalam kasus saya, masalahnya adalah scatterplot dari kerangka data 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
sumber
Penjelasan lebih lanjut akan menyenangkan.
Tejas Shetty
1
Kesalahan nilai berarti kita mencoba memuat array n-elemen (urutan) ke dalam slot nomor tunggal yang hanya memiliki float. Karenanya, Anda mencoba mengatur elemen array dengan urutan. Dengan .toarray () kami memperbesarnya menjadi array urutan. toarray () mengembalikan ndarray;
Max Kleiner
0

Ketika bentuknya tidak teratur atau elemen memiliki tipe data yang berbeda, dtypeargumen yang diteruskan ke np.array hanya bisa 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
sumber
Selamat datang di SO. Pertanyaan ini sudah sangat lama, dan sepertinya jawaban Anda menduplikasi setidaknya satu dari yang lain. Jika jawaban Anda sebenarnya berbeda, coba tambahkan beberapa detail yang menjelaskan caranya.
Jens Ehrich