Σφάλμα Python: μόνο ακέραιους αριθμούς, φέτες ( `:`), αποσιωπητικά ( `` ...), numpy.newaxis ( `Ουδέν) και ακέραιος ή boolean συστοιχίες ισχύουν δείκτες

ψήφοι
0

Καταλαβαίνω ότι υπάρχουν άλλες ερωτήσεις με το ίδιο μήνυμα σφάλματος, ωστόσο έχω κοίταξε αυτά και δεν καταλαβαίνω πώς εφαρμόζεται στην τρέχουσα κατάστασή μου. Έτσι είμαι δημιουργώντας μια μήτρα 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 αν αυτό εξηγεί τα πράγματα κάπως

Δημοσιεύθηκε 27/11/2018 στις 17:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
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, τότε αυτή η προσέγγιση έχει περισσότερο νόημα, καθώς θα στρογγυλοποιεί προς τα πάνω ή προς τα κάτω. int()Θα είναι πάντα όροφο.)

Python εναντίον Matlab

Δύο πράγματα που πρέπει να γνωρίζει:

  1. Matlab προεπιλογή μήτρα πολλαπλασιασμό, ενώ NumPy προεπιλογή των στοιχείων σοφό πολλαπλασιασμού - αλλά αυτό δεν είναι ένα ζήτημα εδώ.
  2. Matlab χρησιμοποιεί 1-ευρετηρίασης ενώ Python (και ως εκ τούτου NumPy) χρησιμοποιεί 0-ευρετηρίασης. Κάθε κωδικός μεταφερθεί από το R ή το Matlab θα πρέπει δείκτες μετατόπιση προς τα κάτω κατά 1.
Απαντήθηκε 27/11/2018 στις 17:52
πηγή χρήστη

ψήφοι
0

Δεν πειράζει ... το βλέπω εγώ: χρησιμοποιείτε ένα floatως δείκτη στην τελική σας γραμμή του κώδικα:

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

Μετατρέψτε το δεύτερο δείκτη να int:

u[j, int((nx-1)/2)]
Απαντήθηκε 27/11/2018 στις 17:52
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more