首页 文章

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

提问于
浏览
23

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

6 回答

  • 40

    您收到错误消息

    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] 中,该数组只有一个浮点数 . 因此,您尝试使用序列(右侧, func(TempLake[i], Z) )设置数组元素(左侧, kOUT[i] ) .

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

  • 3

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

    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)
    

    希望它可以帮到你 .

  • 18

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

    kOUT = np.zeros(N+1)
    kOUT = kOUT.tolist()
    
  • 0
    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,则将缓存此调用的结果,以防止调用该函数两次 . 但是,要实现缓存,必须包装原始函数,这将减慢后续调用,因此只有在功能昂贵的情况下才能执行此操作 .

  • 1

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

    kOUT=np.zeros(N+1)
    

    至:

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

    要么:

    kOUT=np.zeros((N+1), object)
    
  • -1

    KOUT [i]是列表的单个元素 . 但是您要为此元素分配一个列表 . 你的func正在生成一个列表 .

相关问题