Python错误:只有整数、片(`:`)、省略号(`…`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引

Python错误:只有整数、片(`:`)、省略号(`…`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引,python,arrays,python-3.x,Python,Arrays,Python 3.x,我知道还有其他问题与相同的错误信息,但我看了这些,不明白它如何适用于我目前的情况。所以我创建了一个矩阵u=np.zeros(shape=(nt,nx))然后我还有两个数组time=nt*[0]和middles=nx*[0] 这是我试图实现的关于绘制扩散方程的完整代码: import numpy as np import matplotlib.pyplot as plt import math D=1 #diffusion constant set equal to 1 C=1 #creation

我知道还有其他问题与相同的错误信息,但我看了这些,不明白它如何适用于我目前的情况。所以我创建了一个矩阵
u=np.zeros(shape=(nt,nx))
然后我还有两个数组
time=nt*[0]
middles=nx*[0]

这是我试图实现的关于绘制扩散方程的完整代码:

import numpy as np
import matplotlib.pyplot as plt
import math
D=1 #diffusion constant set equal to 1
C=1 #creation rate of neutrons, set equal to 1
L=math.pi
nx=101 #number of steps in x
nt=10002 #number of timesteps
dx=L/(nx-1) #step in x
dt=0.0001 # time step
Z=(D*dt)/(dx*dx) #constant for diffusion term
Z1=C*dt #constant for u term

x1=np.arange(-math.pi/2+0.03079992797, 0, 0.03079992797)
y=np.arange(0.06159985595,math.pi/2, 0.03079992797)
z = np.hstack((x1, y))

u=np.zeros(shape=(nt,nx))
time=nt*[0]
middles=nx*[0]
u[50,0]=1/dx #setting our delta function
for j in range(0,nt-1):
 for i in range(2,nx-1):
     u[j+1,i]=Z*(u[j,i+1]-2*u[j,i]+u[j,i-1])+Z1*u[j,i]+u[j,i]
 u[j,1]=0
 u[j,nx-1]=0
 time[j]=dt*j
 middles[j]=u[j,((nx-1)/2)]
 if i==50 or i==100 or i==250 or i==500 or i==1000 or i==10000:

    plt.plot(time,middles)

 plt.title('Numerical Solution of the Diffusion Equation')
 plt.xlabel('time')
 plt.ylabel('middles')
 plt.show()
然而,我一直在标题
中看到这个错误消息,只有整数、片(
)、省略号(
)、numpy.newaxis(
None
)和整数或布尔数组是有效的索引
错误消息是关于
middles[j]=u[j,((nx-1)/2)]

我试图从Matlabe转换这段代码,如果这能解释一些事情的话

没关系。。。我明白了:您在最后一行代码中使用了一个
float
作为索引:

u[j,((nx-1)/2)]
将第二个索引转换为
int

u[j, int((nx-1)/2)]

当您在计算索引值时意外地创建了一个
float
,通常会出现此错误

在这种情况下:

middles[j] = u[j, ((nx-1)/2)]
…当
(nx-1)
为奇数时,将创建一个
浮点。所以你可以试试:

middles[j] = u[j, int(np.round(((nx-1)/2), 0))]
(我在这里使用的是
np.round
,这可能有些过分,但是如果你开始除以一个2以外的数字,那么这种方法就更有意义了,因为它会向上或向下取整。
int()
总是会使它变小。)

Python与Matlab之比

需要注意两件事:

  • Matlab默认为矩阵乘法,而NumPy默认为元素乘法——但这不是问题所在
  • Matlab使用1索引,而Python(因此NumPy)使用0索引。从R或Matlab移植的任何代码都需要将索引下移1

  • 这种错误的另一个原因是当您在集合中存储索引并通过此

    欢迎使用StackOverflow尝试ND数组/数据帧时。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。您缺少一个
    导入
    、多个变量定义和完整的错误消息。错误消息与示例不匹配-您可以修改它们以使它们对齐吗?错误肯定是2除产生了一个浮点数,但最好能够明确地引用该行。还请在赋值(=)、数学运算符(+、*)和逗号后加上一些空格,以便代码更具可读性。您可以将if语句更改为
    if i in[50100250500100010000]:
    发布两个答案后,此问题已更改。你有一个新问题。请回复原问题,;将新问题作为新问题发布。。。完成所需的调试工作后。查看这个可爱的博客以获取帮助。另外,Python示例的缩进不正确。请记住,在这里提问的目的不仅仅是解决您自己的问题,而且是为了让未来的用户能够解决类似的问题。它仍然会返回一条错误消息,上面说“列表分配索引超出范围”。我刚刚编辑了我的答案,以包括一条关于Matlab 1-indexing和Python 0-indexing的说明。通常,
    列表分配索引超出范围
    错误意味着您终止循环的时间太晚了一步。如果这个答案能解决你的问题,请投票并接受。正如Prune所说,我们修复了原来的bug,现在您遇到了一个单独的bug!它仍然返回一条错误消息,说“列表分配索引超出范围”而不是“仍然”,因为它以前没有产生这个问题,并且在您最初发布的代码中也没有产生这个问题。您有一个不同的错误,需要重新发布。请不要更改问题,除非进行澄清,尤其是在您收到有效答案后。抱歉,这是我第一次在stack overflow中发布,我将在以后的问题中记住这一点。谢谢你的帮助,这不是答案;当你有足够的声誉时,请将此作为评论发布。