35

为什么我会收到此错误消息?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)
4

7 回答 7

56

您收到错误消息

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.])

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

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

于 2012-11-09T16:26:34.150 回答
37

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

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)

希望它可以帮助你。

于 2016-08-24T04:34:11.457 回答
5

我相信 python 数组只是承认值。所以将其转换为列表:

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
于 2015-06-26T00:18:59.907 回答
1
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

提供矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个 for 循环。

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

于 2017-08-09T17:54:45.693 回答
0

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

kOUT=np.zeros(N+1)

到:

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

或者:

kOUT=np.zeros((N+1), object)
于 2017-12-21T06:33:55.567 回答
-1

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

于 2017-06-16T09:39:58.280 回答
-1

您可以尝试 中的expand选项Series.str.split('seperator', expand=True)
默认情况下expandFalse.

expand: bool , defaultFalse
将拆分后的字符串展开成单独的列。

  • 如果True,则返回 DataFrame/MultiIndex 扩展维度。
  • 如果False,则返回包含字符串列表的系列/索引。
于 2019-05-09T07:29:28.570 回答