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, но при указании типа данных выдается сообщение об ошибке, инициировавшее этот пост.

MedicalMath
источник
кто-то хочет удалить все несущественные детали из этого вопроса?
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

``

Сюн Цай
источник
Добро пожаловать в ТАК. Этот вопрос очень старый, и, похоже, ваш ответ дублирует хотя бы один из остальных. Если ваш ответ на самом деле отличается, попробуйте добавить некоторые подробности, которые объясняют, как.
Йенс Эрих