【问题标题】:Python error:only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesPython 错误:只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效索引
【发布时间】:2018-11-27 17:40:13
【问题描述】:

我知道还有其他带有相同错误消息的问题,但是我已经查看了这些问题,但不明白它如何适用于我目前的情况。所以我正在创建一个矩阵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 (None) and integer or boolean arrays are valid indices 错误消息与middles[j]=u[j,((nx-1)/2)] 行有关 我正在尝试从 Matlabe 转换这段代码,如果这能解释一些事情的话

【问题讨论】:

  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。您缺少一个 import、几个变量定义和完整的错误消息。
  • 错误信息与示例不匹配 - 您可以修改它们以使它们对齐吗?错误肯定是除以 2 创建一个浮点数,但能够专门引用该行会很好。
  • 请在你的赋值(=)、数学运算符(+、* 等)和逗号后面加上一些空格,以便代码更具可读性。您可以将 if 语句更改为 if i in [50, 100, 250, 500, 1000, 10000]:
  • 发布了两个答案后,此问题已更改。你有一个新问题。请将此恢复为原始问题;将新问题作为新问题发布...您已投入所需的调试工作之后。请参阅这个可爱的 debug 博客寻求帮助。
  • 另外,Python 示例的缩进不正确。请记住,在这里提问的目的不仅仅是为了解决您自己的问题,也是为了让未来的用户能够解决类似的问题。

标签: python arrays python-3.x


【解决方案1】:

当您使用索引值的一个计算意外创建 float 时,您经常会遇到此错误。

在这种情况下:

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

...当(nx-1) 为奇数时,将创建一个float。所以你可以试试:

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

(我在这里使用np.round,这可能有点矫枉过正,但如果你开始除以2以外的数字,那么这种方法更有意义,因为它会向上或向下舍入。int() 会总是把它放在地板上。)

Python 与 Matlab

需要注意的两件事:

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

【讨论】:

  • 它仍然返回一条错误消息,说“列表分配索引超出范围”
  • 我刚刚编辑了我的答案,以包含有关 Matlab 1-indexing 与 Python 0-indexing 的注释。通常一个list assignment index out of range 错误意味着你已经终止了一个循环太晚了一步。如果它解决了您的问题,请投票并接受此答案。正如 Prune 所说,我们修复了最初的错误,而您现在遇到了一个单独的错误!
【解决方案2】:

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

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

将第二个索引转换为int

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

【讨论】:

  • 它仍然返回一条错误消息,说“列表分配索引超出范围”
  • 不是“仍然”,因为它之前没有产生那个问题,也没有在你最初发布的代码中产生那个问题。您有另一个错误,需要重新发布。请不要更改问题,除非是为了澄清,尤其是在您收到有效答案之后。
  • 抱歉,这是我第一次在堆栈溢出中发帖,我会记住这一点,以备将来的问题。感谢您的帮助
【解决方案3】:

此类错误的其他原因是当您将索引存储在集合中并通过此尝试您的 ND 数组/数据帧时

【讨论】:

  • 这不是答案;当您有足够的声誉时,请将此作为评论发布。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2016-04-29
  • 2019-09-26
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2017-12-08
  • 2019-03-13
相关资源
最近更新 更多