我创建的函数将不接受数组作为参数之一

时间:2018-11-29 15:54:41

标签: python

我编写了一个带有两个参数的函数,一个不带参数。尺寸和另一个没有。模拟。该函数确实完成了所需的工作(计算单位超球面的体积),但是,当我希望在一系列尺寸范围内绘制函数时,它将返回错误:“列表对象无法解释为整数”。

我的功能如下,

def hvolume(ndim, nsim):
    ob = [np.random.uniform(0.0,1.0,(nsim, ndim))]
    ob = np.concatenate(ob) 
    i = 0
    res = []
    while i <= nsim-1:
        arr = np.sqrt(np.sum(np.square(ob[i])))
        i += 1
        res.append(arr)
    N = nsim
    n = ndim
    M = len([i for i in res if i <= 1])
    return ((2**n)*M/N)

错误回溯是:

Traceback (most recent call last):

File "<ipython-input-192-4c4a2c778637>", line 1, in <module>
runfile('H:/Documents/Python Scripts/Q4ATTEMPT.py', wdir='H:/Documents/Python Scripts')

File "C:\Users\u1708511\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
execfile(filename, namespace)

File "C:\Users\u1708511\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "H:/Documents/Python Scripts/Q4ATTEMPT.py", line 20, in <module>
print(hvolume(d, 2))

File "H:/Documents/Python Scripts/Q4ATTEMPT.py", line 4, in hvolume
ob = [np.random.uniform(0.0,1.0,(nsim, ndim))]

File "mtrand.pyx", line 1307, in mtrand.RandomState.uniform

File "mtrand.pyx", line 242, in mtrand.cont2_array_sc

TypeError: 'list' object cannot be interpreted as an integer

我真的不知道从这里去哪里,并且已经在网上进行了彻底的搜索以找到解决方法。不幸的是,我是一个初学者!

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如果您只是简单地尝试函数中的第一行;

ob = [np.random.uniform(0.0,1.0,(nsim, ndim))]

使用列表作为变量之一;

[np.random.uniform(0.0,1.0,([1,2], 2))]

您将收到错误:

TypeError: 'list' object cannot be interpreted as an integer

这是因为统一命令会查找整数,而不是列表。如果您想处理列表,则需要进行for循环。

答案 1 :(得分:0)

在这种情况下,我使用的一种模式是以一个块开头的函数来处理它们是否是迭代器的情况。例如这样的东西。

from collections import Iterator

def hvolume(ndim, nsim):
    outputs = []
    if isinstance(ndim, Iterator):
        for ndim_arg in ndim:
            outputs.append(hvolume(ndim_arg, nsim))
    if isinstance(nsim, Iterator):
        for nsim_arg in nsim:
            outputs.append(hvolume(ndim, nsim_arg))
    if len(outputs) == 0:  # neither above is an Iterator
        # ... the rest of the function but it appends to outputs
    return outputs

答案 2 :(得分:0)

检查方法“ hvolume”的输入参数,似乎您给出了一个nsim或ndim列表,它们应该都是整数值。这会使制服抛出TypeError异常。