ValueError:设置带有序列的数组元素

ValueError: setting an array element with a sequence

提问人:MedicalMath 提问时间:1/13/2011 最后编辑:cottontailMedicalMath 更新时间:11/12/2023 访问量:1727198

问:

为什么要执行以下代码示例:

np.array([[1, 2], [2, 3, 4]])

np.array([1.2, "abc"], dtype=float)

都给出以下错误?

ValueError: setting an array element with a sequence.
python 数组 numpy slice 值错误

评论

1赞 Will 11/3/2022
如果你像我一样,在使用 Pandas 系列时遇到过这个异常,stackoverflow.com/questions/65044042/...可能会有所帮助。

答:

373赞 Sven Marnach 1/13/2011 #1

可能的原因 1:尝试创建交错数组

您可能正在从形状不像多维数组的列表中创建一个数组:

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

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

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

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

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

如果你真的想有一个同时包含字符串和浮点数的 NumPy 数组,你可以使用 dtype ,它允许数组保存任意 Python 对象:object

numpy.array([1.2, "abc"], dtype=object)
89赞 Eric Leschinski 11/25/2017 #2

The Python ValueError:

ValueError: setting an array element with a sequence.

正如它所说的那样,您正在尝试将一系列数字塞入一个数字槽中。它可以在各种情况下抛出。

1. 当您传递要解释为 numpy 数组元素的 python 元组或列表时:

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 会响应说它不知道如何使用序列设置数组元素。

7赞 Andrés M. Jiménez 3/15/2018 #3

就我而言,问题是另一个问题。我正在尝试将 int 列表的列表转换为数组。问题在于,有一个列表的长度与其他列表不同。如果你想证明这一点,你必须做到:

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

就我而言,长度参考是 560。

26赞 Aaditya Ura 4/3/2018 #4

就我而言,我在 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]]

现在它正在工作。

14赞 Adam Liu 8/11/2018 #5

对于那些在Numpy中遇到类似问题的人,一个非常简单的解决方案是:

定义时定义数组以为其赋值。例如:dtype=object

out = np.empty_like(lil_img, dtype=object)

评论

4赞 Krishna 8/11/2018
它与部分已接受的答案有何不同。Edit
3赞 Max Kleiner 3/1/2019 #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)

评论

1赞 Max Kleiner 2/25/2020
值错误意味着我们试图将一个 n 元素数组(序列)加载到一个只有一个浮点数的数字槽中。因此,您正在尝试使用序列设置数组元素。使用 .toarray(),我们将其放大为序列数组。toArray() 返回一个 ndArray;
2赞 xiong cai 7/2/2020 #7

当形状不规则或元素具有不同的数据类型时,传递给 np.array 的参数只能是 。dtypeobject

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

``

评论

0赞 Jens Ehrich 7/2/2020
欢迎来到 SO。这个问题很古老,看起来你的答案至少与其他一个问题重复。如果你的答案实际上不同,试着添加一些更多细节来解释如何做。
2赞 questionto42 8/4/2020 #8

就我而言,我有一个嵌套列表作为我想用作输入的系列。

第一次检查:如果

df['nestedList'][0]

输出一个列表,如 ,你有一个嵌套列表。[1,2,3]

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

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

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

嵌套列表的这种扁平化借鉴自 How to make a flat list out of list?

0赞 Neda Zand 2/2/2023 #9

错误是因为 np.array 函数的 dtype 参数指定了数组中元素的数据类型,并且只能将其设置为与所有元素兼容的单个数据类型。值“abc”不是有效的浮点数,因此尝试将其转换为浮点数会导致 ValueError。若要避免此错误,可以从列表中删除字符串元素,也可以选择可以同时处理浮点值和字符串值的其他数据类型,例如 object。

numpy.array([1.2, "abc"], dtype=object)
0赞 cottontail 9/7/2023 #10

发生此错误的一个常见原因是当您想要使用调用将数组的 dtype 从 to / etc 更改为时。可能有两种情况:objectintfloatastype()

  • a) 锯齿状阵列

    最常见的情况是阵列呈锯齿状。在这种情况下,在更改 dtype 之前,可能需要对“内部”数组进行扁平化。

    import numpy as np
    arr = np.array([1,2, [3,4]], dtype=object)
    arr.astype(int)             # <--- ValueError: setting an array element with a sequence.
    
    # flatten array
    out = []
    for x in arr:
        if isinstance(x, (list, np.ndarray, tuple)):
            out.extend(x)
        else:
            out.append(x)
    arr = np.array(out)         # <--- OK
    
    b) “内部”数组未正确读取

    另一种常见情况是当 dtype 数组的“内部”数组未正确读取时,即使形状和 dtypes 看似 a-OK,也会导致此错误。object

    例如,在以下情况下,“内部”数组具有相同的形状(并且也具有相同的 dtype),因此我们没有锯齿数组问题,但是在调用时,我们在标题中出现错误。arrastype(int)

    arr = np.array([1, 2], dtype=object)
    arr[:2] = [[10], [20]]
    arr                     # array([list([10]), list([20])], dtype=object)
    
    arr.astype(int)         # <--- ValueError: setting an array element with a sequence.
    

    在这种情况下,请转换为列表,稍后再转换为 ndarray;或者只是它。arrstack()

    np.array(arr.tolist())  # <--- OK
    np.stack(arr)           # <--- OK
    

    当尝试使用 将包含 lists/ndarrays 的 pandas 列转换为 numpy ndarray 时,通常会发生此错误。换言之,如果要使用 进行以下转换,则会发生这种情况。astype()astype()

    pandas-case

    在这种情况下,请使用或转换为列表并强制转换为 ndarray,而不是 。astype()stack()

    import pandas as pd
    
    s = pd.Series([[1,2], [3,4]])
    
    s.astype(int)             # <--- ValueError: setting an array element with a sequence.
    s.to_numpy().astype(int)  # <--- ValueError: setting an array element with a sequence.
    np.array(s.tolist())      # <--- OK
    np.stack(s)               # <--- OK
    
np.where()/np.nonzero()返回一个元组

发生此错误的另一个常见示例是,当您想要将返回的值分配给数组时。但是,当仅传递条件时,会返回一个元组(与 相同),这会导致此错误,原因与 Eric Leschinski 的回答中解释的原因相同。在这种情况下,仅分配元组中的相关值(在下面的示例中,这是元组中的第一项)。np.where()np.where()np.nonzero()

arr = np.array([1, 2, 3])

arr[:3] = np.where(arr>0)       # <--- ValueError: ...
arr[:3] = np.where(arr>0)[0]    # <--- OK
arr[:3] = np.nonzero(arr>0)[0]  # <--- OK
1赞 TANMOY CHOWDHURY 11/12/2023 #11

就我而言,这是一个版本问题。我收到 numpy version = 1.24.1 的错误。但是当我降级到 1.21.6 时,问题得到了解决。

python -m pip install numpy==1.21.6