ValueError:使用序列设置数组元素

为什么要做下面的代码示例:

np.array([[1, 2], [2, 3, 4]])
np.array([1.2, "abc"], dtype=float)

...都给出以下错误?

ValueError:使用序列设置数组元素。

1460092 次浏览

可能原因1:试图创建一个锯齿状数组

你可以从一个形状不像多维数组的列表中创建一个数组:

numpy.array([[1, 2], [2, 3, 4]])         # wrong!
numpy.array([[1, 2], [2, [3, 4]]])       # wrong!

在这些例子中,numpy.array的参数包含不同长度的序列。这些将产生此错误消息,因为输入列表的形状不像“;框”;这可以转化成一个多维数组。

可能原因2:提供类型不兼容的元素

例如,在类型为float的数组中提供字符串作为元素:

numpy.array([1.2, "abc"], dtype=float)   # wrong!

如果你真的想要一个既包含字符串又包含浮点数的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. 通过尝试将numpy数组长度> 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会回应说它不知道如何用序列设置数组元素。

对我来说,问题是另一个。我试图将int类型的列表转换为数组。问题是有一个列表与其他列表的长度不同。如果你想证明它,你必须做到:

print([i for i,x in enumerate(list) if len(x) != 560])

在我的例子中,长度参考是560。

在我的例子中,我在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)

在我的例子中,问题在于数据框架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)

当形状不是规则的或元素有不同的数据类型时,dtype参数传递给np。数组只能是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

' '

在我的例子中,我有一个嵌套的列表作为我想要用作输入的系列。

第一次检查:如果

df['nestedList'][0]

输出一个像[1,2,3]这样的列表,你有一个嵌套列表。

然后检查在更改为输入df['nestedList'][0]时是否仍然得到错误。

然后,下一步可能是将所有嵌套列表连接到一个非嵌套列表,使用

[item for sublist in df['nestedList'] for item in sublist]

这种嵌套列表的扁平化是从如何使一个平面列表的列表?中借来的。