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:

К вашему сведению, если я заменю эту проблемную строку кода:

    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 =. Большое спасибо.
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 для интерпретации как элемент массива 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. Пытаясь втиснуть массив массива> 1 в элемент массива массива:

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

``


Добро пожаловать в ТАК. Этот вопрос очень старый, и, похоже, ваш ответ дублирует хотя бы один из остальных. Если ваш ответ на самом деле отличается, попробуйте добавить некоторые подробности, которые объясняют, как.
Йенс Эрих
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.