Numpy ValueError:设置带有序列的数组元素。此消息可能会在没有序列存在的情况下出现?[重复]

2025-03-21 09:07:00
admin
原创
25
摘要:问题描述:为什么我会收到此错误消息? ValueError:使用序列设置数组元素。谢谢Z=np.array([1.0,1.0,1.0,1.0]) def func(TempLake,Z): A=TempLake B=Z return A*B Nlayers=Z.size N=3...

问题描述:

为什么我会收到此错误消息? ValueError:使用序列设置数组元素。谢谢

Z=np.array([1.0,1.0,1.0,1.0])  

def func(TempLake,Z):
    A=TempLake
    B=Z
    return A*B

Nlayers=Z.size
N=3
TempLake=np.zeros((N+1,Nlayers))

kOUT=np.zeros(N+1)
for i in xrange(N):
    kOUT[i]=func(TempLake[i],Z)

解决方案 1:

您收到错误消息

ValueError: setting an array element with a sequence.

因为您尝试设置带有序列的数组元素。我并不是想耍小聪明——错误消息试图准确地告诉您问题是什么。不要认为这是一个神秘的错误,它只是一个短语。哪一行给出了问题?

kOUT[i]=func(TempLake[i],Z)

ith此行尝试将元素设置kOUT为返回的任何值func(TempLAke[i], Z)。查看此i=0案例:

In [39]: kOUT[0]
Out[39]: 0.0

In [40]: func(TempLake[0], Z)
Out[40]: array([ 0.,  0.,  0.,  0.])

您正在尝试加载一个 4 元素数组,其中kOUT[0]只有一个浮点数。因此,您尝试设置一个数组元素(左侧,kOUT[i])和一个序列(右侧,func(TempLake[i], Z))。

可能func没有做你想做的事,但我不确定你真正想让它做什么(并且不要忘记你通常可以使用像 A*B 这样的矢量化操作而不是在 numpy 中循环。)无论如何,这应该可以解释这个问题。

解决方案 2:

可惜两个答案都分析了问题,却没有给出直接的答案,我们看代码吧。

Z = np.array([1.0, 1.0, 1.0, 1.0])  

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B
Nlayers = Z.size
N = 3
TempLake = np.zeros((N+1, Nlayers))
kOUT = np.zeros(N + 1)

for i in xrange(N):
    # store the i-th result of
    # function "func" in i-th item in kOUT
    kOUT[i] = func(TempLake[i], Z)

错误表明您将 kOUT(dtype:int) 的第 i 项设置为数组。这里 kOUT 中的每个项都是 int,不能直接分配给另一个数据类型。因此,您应该在创建 kOUT 时声明其数据类型。例如:

更改下面的语句:

kOUT = np.zeros(N + 1)

进入:

kOUT = np.zeros(N + 1, dtype=object)

或者:

kOUT = np.zeros((N + 1, N + 1))

全部代码:

import numpy as np
Z = np.array([1.0, 1.0, 1.0, 1.0])

def func(TempLake, Z):
    A = TempLake
    B = Z
    return A * B

Nlayers = Z.size
N = 3
TempLake = np.zeros((N + 1, Nlayers))

kOUT = np.zeros(N + 1, dtype=object)
for i in xrange(N):
    kOUT[i] = func(TempLake[i], Z)

希望它能帮助你。

解决方案 3:

我相信 Python 数组只接受值。因此将其转换为列表:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()

解决方案 4:

Z=np.array([1.0,1.0,1.0,1.0])  

def func(TempLake,Z):
    A=TempLake
    B=Z
    return A*B
Nlayers=Z.size
N=3
TempLake=np.zeros((N+1,Nlayers))
kOUT=np.vectorize(func)(TempLake,Z)

这也有效,而不是循环,只需矢量化,但是请阅读 scipy 文档中的以下注释:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

vectorize 函数主要是为了方便使用,而不是为了提高性能。其实现本质上是一个 for 循环。

如果未指定 otypes,则将使用第一个参数调用函数来确定输出数量。如果 cache 为 True,则将缓存此调用的结果,以防止两次调用该函数。但是,要实现缓存,必须包装原始函数,这会减慢后续调用的速度,因此只有当您的函数很昂贵时才这样做。

解决方案 5:

要将序列或另一个 numpy 数组放入 numpy 数组中,只需更改此行:

kOUT=np.zeros(N+1)

到:

kOUT=np.asarray([None]*(N+1))

或者:

kOUT=np.zeros((N+1), object)

解决方案 6:

KOUT[i] 是列表的单个元素。但您正在为该元素分配一个列表。您的函数正在生成一个列表。

解决方案 7:

您可以尝试expand中的选项Series.str.split('seperator', expand=True)

默认情况expand下为False

expandbool,默认将False

分割的字符串扩展为单独的列。

  • 如果True,返回 DataFrame/MultiIndex 扩展维数。

  • 如果是False,则返回包含字符串列表的 Series/Index。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1950  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1439  
  在企业运营过程中,跨部门协作效率的高低直接影响着项目的推进速度与质量,进而关乎企业的整体竞争力。PLM(产品生命周期管理)项目管理软件作为一种强大的工具,正逐渐在提升跨部门协作效率方面发挥着关键作用。它打破了部门之间的信息壁垒,优化了业务流程,为企业各部门之间的协同工作提供了有力支持。PLM项目管理软件打破信息壁垒信息...
plm合规性管理   17  
  PLM(Product Lifecycle Management)软件,即产品生命周期管理软件,旨在助力企业对产品从概念设计到退役处理的全生命周期进行有效管理。通过整合产品数据、流程以及人员,PLM软件能显著提升企业的创新能力、生产效率并降低成本。然而,PLM软件的实施并非易事,众多企业在落地过程中遭遇诸多挑战。要实现...
国内plm系统排名   19  
  研发过程的可视化对于企业提升效率、保障项目顺利推进至关重要。PLM(产品生命周期管理)系统作为整合产品全生命周期信息的重要工具,与甘特图相结合,能为研发过程可视化提供强大支持。通过对PLM系统支撑下甘特图的优化展现,可以让项目团队成员、管理层等清晰了解研发进度、资源分配等关键信息,从而做出更科学的决策。接下来,我们将详...
plm系统主要干什么的   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用