ValueError: установка элемента массива с последовательностью
Этот код 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, но при указании типа данных выдается сообщение об ошибке, инициировавшее этот пост.
10 ответов
Из кода, который вы нам показали, единственное, что мы можем сказать, это то, что вы пытаетесь создать массив из списка, который не имеет форму многомерного массива. Например
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)
Не зная, что ваш код будет выполнять, я не могу судить, если это то, что вы хотите.
Ошибка 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 ответит, что не знает, как установить элемент массива с последовательностью.
В моем случае я получил эту ошибку в 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]]
Теперь это работает.
Для тех, кто испытывает проблемы с подобными проблемами в Numpy, очень простое решение будет:
определяющий dtype=object
при определении массива для присвоения ему значений. например:
out = np.empty_like(lil_img, dtype=object)
В моем случае проблема была в другом. Я пытался преобразовать списки списков Int в массив. Проблема заключалась в том, что был один список, длина которого отличалась от других. Если вы хотите доказать это, вы должны сделать:
print([i for i,x in enumerate(list) if len(x) != 560])
В моем случае эталон длины был 560.
В моем случае проблема была в диаграмме рассеяния кадра данных 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)
В моем случае у меня был вложенный список как ряд, который я хотел использовать в качестве входных данных.
Первая проверка: если
df['nestedList'][0]
выводит список вроде [1,2,3]
, у вас есть вложенный список.
Затем проверьте, появляется ли по-прежнему ошибка при переходе на ввод df['nestedList'][0]
.
Тогда вашим следующим шагом, вероятно, будет объединение всех вложенных списков в один невложенный список, используя
[item for sublist in df['nestedList'] for item in sublist]
Это уплощение вложенного списка заимствовано из статьи Как сделать плоский список из списка списков?.
Когда форма не правильная или элементы имеют разные типы данных, 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
``
В моем случае это была проблема версии. Я получил ошибку для версии numpy = 1.24.1. Но когда я понизил версию до 1.21.6, проблема была устранена.
python -m pip install numpy==1.21.6
Ошибка заключается в том, что аргумент dtype функции np.array указывает тип данных элементов в массиве, и для него может быть задан только один тип данных, совместимый со всеми элементами. Значение «abc» не является допустимым числом с плавающей запятой, поэтому попытка преобразовать его в число с плавающей запятой приводит к ошибке ValueError. Чтобы избежать этой ошибки, вы можете либо удалить строковый элемент из списка, либо выбрать другой тип данных, который может обрабатывать как значения с плавающей запятой, так и строковые значения, например объект.
numpy.array([1.2, "abc"], dtype=object)