如何修复numpy数组中的“ IndexError:仅整数”?

时间:2018-09-13 02:12:53

标签: python numpy sympy

(已解决。请参见下面的答案)我正在自学Python以准备学校项目。我遇到以下错误,无法弄清楚该如何解决:

IndexError:只有整数,切片(:),省略号(...),numpy.newaxis(None)和整数或布尔数组都是有效索引

这是我要运行的代码(根据注释对其进行了一些编辑)

from sympy import *
from sympy.abc import i
from mpmath import *
import numpy as np
np.set_printoptions(suppress=True)

N = 3
M = np.zeros(shape=(N, N))
for n in range(0, N):
    M[0, n] = fac(n)    # mpmath.fac
for m in range(1, N):
    for n in range(0, N):
        M[m, n] = (Sum(M[m - 1, i], (i, 0, n + 1))) / (n+1) 
print(M)

本质上,我想为数组指定尺寸,并为数组指定第一行。然后,我要以某种方式构造数组中的其余条目(如果您知道该求和技术,则应具有Holder可汇总性)。

我已经用这个特殊的错误查看了堆栈溢出中的其他各种问题,但是这些问题超出了我目前的知识范围,或者没有完全解决我的问题。我弄弄了很多参数,并将问题隔离到第13行。特别是,一旦我在M [m-1,i]中放入“ i”,就会收到错误消息。如果我输入的数字小于维数而不是“ i”,那么我的代码就会运行,但这不是我需要的构造。

例如,条目M[2,1]的构造应为:

M[2,1] = (M[1,0] + M[1,1]) / 2

我认为这相当于我写的总和。我的索引如何变成正整数以外的东西?

谢谢!

2 个答案:

答案 0 :(得分:1)

您正在混用numpysympy,但出现了问题:

您的sympy导入将i定义为符号(对numpy用户而言并不明显):

In [1]: from sympy.abc import *
In [2]: i
Out[2]: i

然后定义一个numpy数组。 (import numpy as np*好):

In [3]: M=np.zeros((3,3))

尝试将此i用作索引会引发您的错误:

In [4]: M[1,i]
------------------------------------------------------------------
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

符号可以在sympy矩阵中工作,但在为numpy数组建立索引时不起作用。

Ms = sy.zeros(3,3)      # sympy matrix  
for m in range(1,3):
    for n in range(3):
        Ms[m,n] = (sy.Sum(Ms[m-1,i],(i,0,n+1)))/(n+1)

这会运行,尽管生成的Ms没有多大意义。

因此,问题的根源在于,您可能是由于无知,并且可能是由于*的导入而混合了numpy和sympy。

答案 1 :(得分:0)

我能够在这里所有人的帮助下纠正错误。谢谢!我看到我不应该将所有内容都导入星号,并且我应该坚持使用sympy或numpy,以便它们之间不会发生争斗。我成功地重写了程序以正确构建Holder的总和。这是我的运行代码:

import sympy as sy
import mpmath as mp
import numpy as np
np.set_printoptions(suppress=True)
sy.init_printing(use_unicode=False, wrap_line=False, no_global=True)
N = 5
M = np.zeros((N, N))
for n in range(0, N):                       
    M[0, n] = mp.fac(n)
for n in range(0, N):                      
    for i in range(0, n + 1):
        M[1, n] += (M[0, i])
for m in range(2, N):                       
    for n in range(0, N):
        for i in range(0, n + 1):
            M[m, n] += (M[m - 1, i])
        M[m, n] = M[m, n] / (n + 1)
print(M)                                    

可以正确(精美地)打印:

[[ 1.          1.          2.          6.         24.        ]
 [ 1.          2.          4.         10.         34.        ]
 [ 1.          1.5         2.33333333  4.25       10.2       ]
 [ 1.          1.25        1.61111111  2.27083333  3.85666667]
 [ 1.          1.125       1.28703704  1.53298611  1.99772222]]

再次感谢您的帮助!