(已解决。请参见下面的答案)我正在自学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
我认为这相当于我写的总和。我的索引如何变成正整数以外的东西?
谢谢!
答案 0 :(得分:1)
您正在混用numpy
和sympy
,但出现了问题:
您的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]]
再次感谢您的帮助!