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.
Может ли кто-нибудь показать мне, что нужно сделать, чтобы исправить проблему в неработающем коде выше, чтобы он перестал выдавать сообщение об ошибке?
EDIT:
Я сделал команду печати, чтобы получить содержимое матрицы, и вот что она распечатала:
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, но при указании типа данных выдается сообщение об ошибке, инициировавшее этот пост.
Ответы
Ответ 1
Из кода, который вы нам показали, единственное, что мы можем сказать, это то, что вы пытаетесь создать массив из списка, который не имеет форму многомерного массива. Например
numpy.array([[1,2], [2, 3, 4]])
или же
numpy.array([[1,2], [2, [3, 4]]])
выдаст это сообщение об ошибке, потому что форма списка ввода не является (обобщенным) "блоком", который можно превратить в многомерный массив. Так что, вероятно, UnFilteredDuringExSummaryOfMeansArray
содержит последовательности различной длины.
Редактировать: Другая возможная причина для этого сообщения об ошибке - попытка использовать строку в качестве элемента в массиве типа float
:
numpy.array([1.2, "abc"], dtype=float)
Это то, что вы пытаетесь в соответствии с вашими правками. Если вы действительно хотите иметь массив NumPy, содержащий как строки, так и числа с плавающей точкой, вы можете использовать object
dtype, который позволяет массиву содержать произвольные объекты Python:
numpy.array([1.2, "abc"], dtype=object)
Не зная, что ваш код будет выполнять, я не могу судить, если это то, что вы хотите.
Ответ 2
Значение 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. Путем того, чтобы вставить numpy array length > 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 отвечает, что он не знает, как установить элемент массива с последовательностью.
Ответ 3
В моем случае, я получил эту ошибку в 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]]
Теперь он работает.
Ответ 4
В моем случае проблема была другая. Я пытался конвертировать списки списков int в массив. Проблема заключалась в том, что был один список с другой длиной, чем другие. Если вы хотите это доказать, вы должны сделать:
print([i for i,x in enumerate(list) if len(x) != 560])
В моем случае ссылка на длину была 560.
Ответ 5
для тех, кто испытывает проблемы с подобными проблемами в Numpy, очень простое решение будет:
определение dtype=object
при определении массива для присвоения ему значений. например:
out = np.empty_like(lil_img, dtype=object)
Ответ 6
В моем случае проблема была в диаграмме рассеяния кадра данных 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)
Ответ 7
У меня похожая проблема, у меня большой набор данных записей, и все записи имеют значения с плавающей запятой, и каждая запись имеет одинаковый размер (300)
print(type(train_on[0][0]))
print(type(train_on[0]))
print(type(train_on))
дает вывод
<class 'numpy.float32'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
просто чтобы убедиться, что каждый из них имеет одинаковую длину, я перепроверил с помощью следующего кода, и каждая запись имеет одинаковый размер
count=0
for i in range(train_on.shape[0]):
if train_on[i].size==300:
count+=1
print(count)
count/train.shape[0]
и он возвращается
66376
1.0
ошибка появляется, когда я пытаюсь передать ее в модель логистической регрессии
logr = LogisticRegression(solver='sag')
logr.fit(train_on,train['A'])
это ошибка
--> 522 array = np.asarray(array, dtype=dtype, order=order)
523 except ComplexWarning:
524 raise ValueError("Complex data not supported\n"
/anaconda/envs/py35/lib/python3.5/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
536
537 """
--> 538 return array(a, dtype, copy=False, order=order)
539
540
ValueError: setting an array element with a sequence.
Кто-нибудь может мне с этим помочь