Numpy ValueError:使用序列设置数组元素.此消息可能在没有序列存在的情况下出现?

use*_*224 24 python arrays element numpy

为什么我收到此错误消息?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)
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 41

您收到错误消息

ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)

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

kOUT[i]=func(TempLake[i],Z)
Run Code Online (Sandbox Code Playgroud)

此行尝试将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.])
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我发现这个消息也很神秘. (52认同)
  • 我想让它告诉我WHAT序列设置了什么元素.没有提到这是没有用的. (4认同)
  • numpy的github(https://github.com/numpy/numpy/issues/6584)讨论了如何更改此消息以更好地描述创建的各种情况.Johnny Wong在下面的回答澄清了我案件中发生的事情. (3认同)
  • 是的,这绝对是一个神秘的消息。Windows BSOD 甚至可能比这更有帮助。 (2认同)

小智 22

遗憾的是,这两个答案都找出了问题,但没有得出结论来解决这个问题.我们来看看代码.

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)
Run Code Online (Sandbox Code Playgroud)

错误显示您将kOUT(dtype:int)的第i项设置为数组,kOUT中的每个项只是一个int项,不能指向其他数据类型,您应该更改语句以更改kOUT的数据类型.例如,像:

更改以下声明:

kOUT = np.zeros(N + 1)
Run Code Online (Sandbox Code Playgroud)

成:

kOUT = np.zeros(N + 1, dtype=object)
Run Code Online (Sandbox Code Playgroud)

要么:

kOUT = np.zeros((N + 1, N + 1))
Run Code Online (Sandbox Code Playgroud)

所有代码:

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)
Run Code Online (Sandbox Code Playgroud)

希望它可以帮到你.


小智 5

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

kOUT = np.zeros(N+1)
kOUT = kOUT.tolist()
Run Code Online (Sandbox Code Playgroud)