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.

Хто-небудь може мені показати, що робити, щоб виправити проблему в зламаному коді вище, щоб він перестав кидати повідомлення про помилку?


EDIT: Я зробив команду print, щоб отримати вміст матриці, і ось що вона надрукувала:

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 стовпців, хоча кількість рядків мінлива, коли різні дані проходять через сценарій. З тими ж даними, які я додаю в цьому.

EDIT 2 : Однак сценарій видає помилку. Тож я не думаю, що ваша ідея пояснює проблему, яка тут відбувається. Дякую, хоча. Будь-які інші ідеї?


EDIT 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
Дякую, але я не думаю, що це відповідь. Я додав вміст масиву, коли він видає помилку вище. І мені здається, що це ящик, коли я вставляю його в блокнот і оглядаю його по черзі. Будь-які інші ідеї?
MedicalMath

2
Здається, ваша редакція вирішила мою проблему. Мені потрібно було встановити dtype = object. Велике спасибі.
MedicalMath

На це питання повністю відповіли.
MedicalMath

Іншою можливістю може бути проблема в 1.9 при створенні масиву об'єктів (не обов'язково списків), які реалізуються, __getitem__як зазначено тут: github.com/numpy/numpy/isissue/5100
dashesy

47

Python ValueError:

ValueError: setting an array element with a sequence.

Означає саме те, що воно говорить, ви намагаєтеся встромити послідовність чисел в один слот для чисел. Його можна кинути за різних обставин.

1. При передачі кортежу або списку пітона, який слід інтерпретувати як елемент масивного масиву:

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. Спробувавши стиснути нумеровий масив довжиною> 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 не знає, як з'єднати багатозначні кортежі або масиви в слоти одного елемента. Він очікує, що ви дасте йому оцінити на одне число, якщо це не так, Numpy відповідає, що не знає, як встановити елемент масиву з послідовністю.


дуже приємне пояснення
Техас Шетті

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.

але якщо я роблю прокладки, то:

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

Зараз це працює.


Я використовував PyCuda і випадково призначений gpuarray елемент для Numpy масиву. Я отримав таку ж помилку.
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

У моєму випадку проблема полягала у розкиданні фрейму даних 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)

Ще кілька пояснень було б непогано.
Техас Шетті

1
Помилка значення означає, що ми намагаємося завантажити масив (послідовність) n-елементів у один слот чисел, у якого є лише поплавок. Отже, ви намагаєтеся встановити елемент масиву з послідовністю. За допомогою .toarray () ми збільшуємо його до масиву послідовності. toarray () повертає ndarray;
Макс Клейнер

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. Це запитання дуже старе, і схоже, що ваша відповідь дублює хоча б одну з інших. Якщо ваша відповідь насправді інша, спробуйте додати ще детальну інформацію, яка пояснює, як це зробити.
Єнс Еріх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.