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

2025-03-21 09:07:00
admin
原创
26
摘要:问题描述:为什么我会收到此错误消息? 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2023  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1450  
  引言PLM(产品生命周期管理)合规性管理在汽车行业正扮演着日益关键的角色。随着汽车产业的不断发展,法规要求愈发严格,消费者对产品质量和安全性的期望也持续攀升。汽车企业需要在整个产品生命周期内确保合规,从设计研发阶段到生产制造,再到产品的售后使用与回收处理。这不仅关乎企业能否避免巨额罚款和法律诉讼,更影响着企业的品牌声誉...
plm是什么意思   4  
  引言企业的可持续发展如今已成为全球关注的焦点,这不仅关乎企业自身的长期生存与繁荣,更对整个社会和环境的健康发展有着深远影响。在实现可持续发展目标的征程中,企业面临着诸多复杂的挑战,涵盖了从资源管理、环境保护到社会责任履行等多个维度。而产品生命周期管理(PLM)系统作为一种强大的数字化工具,正逐渐展现出其在助力企业达成可...
plm软件有哪些   4  
  PLM(Product Lifecycle Management)软件在制造业中扮演着至关重要的角色,它贯穿于产品从概念设计到退役处理的整个生命周期,为企业提供了集成化的管理平台,有效提升了企业的创新能力、生产效率和产品质量。以下将详细阐述 PLM 软件在制造业中的五大核心应用场景。产品设计与研发管理在产品设计与研发阶...
国产plm软件排名   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用