2 votes

Erreur Python : seuls les entiers, les tranches (`:`), les ellipses (`...`), numpy.newaxis (`None`) et les tableaux d'entiers ou de booléens sont des indices valides.

Je comprends qu'il y a d'autres questions avec le même message d'erreur, mais j'ai regardé ces questions et je ne comprends pas comment elles s'appliquent à ma situation actuelle. Je crée donc une matrice u=np.zeros(shape=(nt,nx)) et j'ai également deux tableaux time=nt*[0] y middles=nx*[0]

Voici le code complet que j'essaie d'implémenter en ce qui concerne le tracé de l'équation de diffusion :

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()

Cependant, j'obtiens toujours le message d'erreur indiqué dans le titre only integers, slices ( : ), ellipsis ( ... ), numpy.newaxis ( Aucun ) and integer or boolean arrays are valid indices Le message d'erreur concerne le middles[j]=u[j,((nx-1)/2)] ligne J'essaie de convertir ce code à partir de Matlabe, si cela explique un peu les choses

4voto

ajrwhite Points 627

Vous obtenez souvent cette erreur lorsque vous créez accidentellement un fichier float avec l'un de vos calculs d'une valeur d'indice.

En l'occurrence :

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

...créera un float quand (nx-1) est impair. Vous pouvez donc essayer :

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

(J'utilise np.round ici, ce qui est peut-être exagéré, mais si vous commencez à diviser par un nombre autre que 2, cette approche est beaucoup plus logique, car elle arrondira vers le haut OU vers le bas. int() le plancher).

Python contre Matlab

Deux choses à savoir :

  1. Matlab utilise par défaut la multiplication matricielle, alors que NumPy utilise par défaut la multiplication par éléments - mais ce n'est pas un problème ici.
  2. Matlab utilise l'indexation 1 alors que Python (et donc NumPy) utilise l'indexation 0. Tout code porté depuis R ou Matlab nécessitera un décalage des indices de 1 vers le bas.

2voto

Prune Points 4656

Qu'à cela ne tienne... Je vois : vous utilisez un float comme index dans votre dernière ligne de code :

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

Convertir le deuxième indice en int :

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

0voto

shantanu kumar Points 9

Ce type d'erreur se produit également lorsque vous stockez des indices dans un ensemble et que vous essayez d'utiliser votre tableau/dataframe ND de la manière suivante

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X