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

2024-12-11 08:47:00
admin
原创
139
摘要:问题描述:为什么会出现下面的代码示例:np.array([[1, 2], [2, 3, 4]]) np.array([1.2, "abc"], dtype=float) 都出现以下错误?ValueError: setting an array element with a sequenc...

问题描述:

为什么会出现下面的代码示例:

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

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

都出现以下错误?

ValueError: setting an array element with a sequence.

解决方案 1:

可能的原因 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)

解决方案 2:

Python 值错误:

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

解决方案 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:

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

定义dtype=object数组时为其分配值。例如:

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

解决方案 5:

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

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

就我的情况来说,长度参考是 560。

解决方案 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:

发生此错误的一个常见原因是当您想使用调用将数组的 dtype 从 更改objectint/等时。可能有两种情况:float`astype()`

  • 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) “内部”数组读取不正确

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

例如在以下情况下,“内部”数组arr具有相同的形状(并且具有相同的 dtype),因此我们没有锯齿状数组问题,但是在调用时astype(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.

在这种情况下,先转换arr为列表,稍后再转换为 ndarray;或者仅stack()此而已。

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

当尝试使用 将包含列表/ndarrays 的 pandas 列转换为 numpy ndarray 时,通常会发生此错误astype()。换句话说,如果您想使用 进行以下转换,就会发生这种情况astype()

pandas 案例

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

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()返回一个元组

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

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

解决方案 8:

当形状不规则或元素具有不同的数据类型时,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

``

解决方案 9:

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

首先检查:如果

df['nestedList'][0]

输出类似的列表[1,2,3],您有一个嵌套列表。

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

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

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

这种嵌套列表的扁平化借鉴自如何用列表列表制作扁平列表?。

解决方案 10:

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

python -m pip install numpy==1.21.6

解决方案 11:

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

numpy.array([1.2, "abc"], dtype=object)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用