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
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
。
expand
:bool,默认将False
分割的字符串扩展为单独的列。
如果
True
,返回 DataFrame/MultiIndex 扩展维数。如果是
False
,则返回包含字符串列表的 Series/Index。