IndexError: dizi için çok fazla indis
Bu konulardan bir ton olduğunu biliyorum ama hepsi 3x3 matrisler ve bu tür şeyler gibi çok basit durumlar için ve çözümler benim durumuma uygulanmaya bile başlamıyor. Bu yüzden G ile l1'in (on bir değil, L1) grafiğini çıkarmaya çalışıyorum. Veriler bir excel dosyasından yüklediğim dosyada. Excel dosyası 14x250, yani her biri 250 veri noktası içeren 14 argüman var. Başka bir kullanıcı (Hugh Bothwell'e sesleniyorum!) kodumdaki bir hata konusunda bana yardımcı oldu, ancak şimdi başka bir hata ortaya çıktı.
İşte söz konusu kod:
# format for CSV file:
header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI',
'S', 'P_right', 'P1_0', 'P3_0',
'w_left', 'w_right', 'G_left', 'G_right']
def loadfile(filename, skip=None, *args):
skip = set(skip or [])
with open(filename, *args) as f:
cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
return np.array(row for i,row in enumerate(cr) if i not in skip)
#plot data
outputs_l1 = [loadfile('C:\\Users\\Chris\\Desktop\\Work\\Python Stuff\\BPCROOM - Shingles analysis\\ERR analysis\\l_1 analysis//BS(1) ERR analysis - l_1 - P_3 = {}.csv'.format(p)) for p in p3_arr]
col = {name:i for i,name in enumerate(header)}
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
gl = data[:, col["G_left" ]] * 1000.0 # column 12
gr = data[:, col["G_right"]] * 1000.0 # column 13
plt.plot(xs, gl, color + "-", gr, color + "--")
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,11]*1E3, col+'--')
plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1))
plt.xlabel('$l1 (m)$')
plt.ylabel('G $(J / m^2) * 10^{-3}$')
plt.xlim(xmin=.2)
plt.ylim(ymax=2, ymin=0)
plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7)
Tüm programı çalıştırdıktan sonra hata mesajı alıyorum:
Traceback (most recent call last):
File "C:/Users/Chris/Desktop/Work/Python Stuff/New Stuff from Brenday 8 26 2014/CD_ssa_plot(2).py", line 115, in <module>
xs = data[:, col["l1" ]]
IndexError: too many indices for array
ve bu sorunla karşılaşmadan önce, yukarıdaki hata mesajının atıfta bulunduğu satırın birkaç altındaki satırla ilgili başka bir sorun yaşadım:
Traceback (most recent call last): File "FILE", line 119, in <module>
gl = data[:, col["G_left" ]] * 1000.0 # column 12
IndexError: index 12 is out of bounds for axis 1 with size 12
İlk hatayı anlıyorum, ancak düzeltmekte sorun yaşıyorum. İkinci hata ise benim için kafa karıştırıcı. Patronum gerçekten ensemde, bu yüzden herhangi bir yardım ÇOK takdir edilecektir!
Tespit edilmesi çok kolay olmasa da, sorunun hata mesajında verildiğini düşünüyorum:
'Çok fazla indeks' çok fazla indeks değeri verdiğiniz anlamına gelir. Verinin 2 boyutlu bir dizi olmasını beklediğiniz için 2 değer vermişsiniz. Numpy şikayet ediyor çünkü
data
2D değil (ya 1D ya da None).Bu biraz tahmin - acaba loadfile() işlevine aktardığınız dosya adlarından biri boş bir dosyayı mı yoksa kötü biçimlendirilmiş bir dosyayı mı işaret ediyor? Eğer öyleyse, 1D ya da hatta boş bir dizi döndürebilirsiniz (
np.array(None)
birHata
atmaz, bu yüzden asla bilemezsiniz...). Bu hataya karşı korunmak istiyorsanız,loadfile
fonksiyonunuza bazı hata kontrolleri ekleyebilirsiniz.For döngüsüne eklemenizi şiddetle tavsiye ederim:
Bu Python 2.x veya 3.x'de çalışacaktır ve sorunun kaynağını ortaya çıkarabilir. Sorunun
outputs_l1
listenizin sadece bir değerinde (yani bir dosyada) olduğunu görebilirsiniz.Aldığınız mesaj Python'un varsayılan İstisnası için değildir:
Yeni bir python listesi için,
IndexError
yalnızca indeks aralıkta olmadığında atılır (hatta docs böyle söyler).Listeye birden fazla öğe veya başka bir değer aktarmayı denersek,
TypeError
alırız:Ancak burada, dizileri işlemek için dahili olarak
numpy
]2 kullananmatplotlib
kullanıyor gibi görünüyorsunuz. Numpy` için [kod tabanında] daha derine indiğimizde şunu görüyoruz:Burada, dizinin boyutu sonuçların boyutundan büyükse unpack yöntemi hata verir.
Bu nedenle, yanlış Dizinlerde
TypeError
yükselten Python'un aksine, Numpy çok boyutlu dizileri desteklediği içinIndexError
yükseltir.