2012-11-09 45 views

回答

36

你得到错误信息

ValueError: setting an array element with a sequence. 

因为你想设置一个序列的数组元素。我并不想变得可爱,那里 - 错误信息是试图告诉你究竟是什么问题。不要认为它是一个神秘的错误,它只是一个短语。哪条线给出了这个问题?

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

此行尝试的kOUTith元件设置为任何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中循环)。无论如何,这应该解释这个问题。

+17

我找到了信息也很神秘。 – SherylHohman

+2

有关numpy的github(https://github.com/numpy/numpy/issues/6584)关于更改此消息的讨论以更好地描述创建的各种情况。下面的答案澄清了我的情况。 – SherylHohman

+1

我想告诉我WHAT序列设置了什么元素。没有提到这是没有用的。 – Louis

3

我相信python数组只是承认值。所以它转换成列表:

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

可惜的是,这两个问题的答案找出问题,但并没有给出一个结论来解决。 让我们看看代码。

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的第i个项目(D型:INT)成阵列,在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) 

希望它能帮助你。

-1

KOUT [i]是列表中的单个元素。但是你正在给这个元素分配一个列表。你的func正在生成一个列表。

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循环。

如果未指定类型,则将使用具有第一个参数的函数调用来确定输出的数量。如果缓存为True,该调用的结果将被缓存以防止两次调用该函数。但是,要实现缓存,原始函数必须被打包,这将减慢后续调用,所以只有在您的函数非常昂贵时才能执行此操作。

0

为了把一个序列或其他numpy的阵列到numpy的阵列, 只是改变这一行:

kOUT=np.zeros(N+1) 

到:

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

或者:

kOUT=np.zeros((N+1), object) 
相关问题