Python错误:仅整数,切片(`:`),省略号(`...`),numpy.newaxis(`None`)和整数或布尔数组为有效索引

时间:2018-11-27 17:40:14

标签: 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 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()

不过,我一直在标题only integers, slices (中看到此错误消息:), ellipsis ( ... ), numpy.newaxis () and integer or boolean arrays are valid indices 错误消息是关于middles[j]=u[j,((nx-1)/2)] 行的 我正在尝试从Matlabe转换此代码,如果这在某种程度上解释了事情

3 个答案:

答案 0 :(得分:0)

没关系……我看到了:您在最后一行代码中使用float作为索引:

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

将第二个索引转换为int

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

答案 1 :(得分:0)

当您用索引值的一种计算方式意外创建float时,经常会出现此错误。

在这种情况下:

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

...当float为奇数时将创建一个(nx-1)。因此,您可以尝试:

middles[j] = u[j, int(np.round(((nx-1)/2), 0))]

((我在这里使用np.round,这可能有点过分,但是如果您开始除以2以外的数字,则此方法更有意义,因为它将向上或向下取整。{{ 1}}将始终覆盖它。)

Python与Matlab

需要注意的两件事:

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

答案 2 :(得分:0)

这种类型错误的另一个原因是当您将索引存储在集合中并通过此尝试您的 ND 数组/数据帧时