ValueError:使用序列设置数组元素

时间:2016-12-02 11:34:24

标签: python numpy

这两节我的代码给出了以下错误消息。

def Simpsons(a, b, n, f, x):
    h=(b-a)/n
    s = 0.
    step = a + h 
    for i in range(1, int(n/2)):
        s += 4*f(x)
        #step += 2*h

    step = a + 2 * h
    for i in range(2, int(n/2 - 1)):
        s += 2*f(x)
        #step += 2 * h

    area = (h/3) * (f(a) + f(b) + s)
    return area

for i in range(0, len(list_n)):
    for j in range(0, len(Functions)):
        x = np.linspace(a, b, list_n[i])
        error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1,         list_n[i], Functions[j], x)
print(error_simp)

发出此信息:

   error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1, list_n[i], Functions[j], x)
ValueError: setting an array element with a sequence.

这是为什么?我尝试的一切都没有摆脱它。

2 个答案:

答案 0 :(得分:0)

我猜你试图将数组加载到error_simp [j,i]中,它可能只能包含浮点数。

这是一个简单的例子,说明了这个错误:

import numpy
b = numpy.zeros(5)
b[0] = numpy.zeros(5) - 1

产生相同的错误。

看起来Simpsons函数返回数组或Exact_intergrals[j]包含数组。

如果您需要在error_simp矩阵中保存数组,请尝试再添加一个维度:

error_simp = np.zeros((rows, cols, additional_dimension_size))

(另一种选择是在构造函数中显式设置dtype=object选项,但速度要慢得多,不推荐使用。)

有一些类似的问题可能有所帮助:this onethis

答案 1 :(得分:0)

给定一个数组时,你的辛普森一家的函数返回一个相同大小的数组:

In [335]: Simpsons(0,1,10, lambda x:x**2, np.linspace(0,1,3))
Out[335]: array([ 0.03333333,  0.2       ,  0.7       ])

您没有显示error_simp的初始化方式。使用error_simp[j, i]=...和错误表明

np.zeros((n,m), float)

或类似的东西。

要获得进一步的帮助,您需要指定您希望放在error_simp中的内容。如果x对于所有元素都相同,则可以创建匹配的3d数组。如果x的长度不同,则必须为dtype=object。但我喜欢不鼓励初学者使用这种用法。这样的数组只不过是一个美化(或贬低)列表的列表。对于使用这种阵列可以做什么,很容易产生不切实际的期望。

======

仔细查看

for i in range(0, len(list_n)):
    for j in range(0, len(Functions)):
        x = np.linspace(a, b, list_n[i])

您可能正在创建不同的尺寸x。您没有显示list_n,但它可能类似于[10,12,14,...],为不同的n测试此函数。