问题: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
因此,您可以看到我需要指定数据类型以便能够在matplotlib中使用ylim,但是指定数据类型会引发引发此帖子的错误消息。
回答 0
从您展示给我们的代码中,我们唯一可以看出的是您正在尝试从形状不像多维数组的列表中创建数组。例如
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
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的numpy数组塞入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会回答说它不知道如何设置带有序列的数组元素。
回答 2
就我而言,我在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]]
现在可以了。
回答 3
对于那些在Numpy中遇到类似问题的人,一个非常简单的解决方案是:
定义dtype=object
限定的阵列用于向它分配值时。例如:
out = np.empty_like(lil_img, dtype=object)
回答 4
就我而言,问题是另一个。我正在尝试将int列表转换为array。问题在于,一个列表的长度与其他列表不同。如果要证明这一点,则必须执行以下操作:
print([i for i,x in enumerate(list) if len(x) != 560])
在我的情况下,长度参考为560。
回答 5
就我而言,问题在于数据帧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)
回答 6
当形状不规则或元素具有不同的数据类型时,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
“