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:

IndexError: too many indices for array
xs  = data[:, col["l1"     ]]

'Ç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) bir Hata 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:

print(data)

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.

Yorumlar (0)

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

>>> l = []
>>> l[1]
IndexError: list index out of range

Listeye birden fazla öğe veya başka bir değer aktarmayı denersek, TypeError alırız:

>>> l[1, 2]
TypeError: list indices must be integers, not tuple

>>> l[float('NaN')]
TypeError: list indices must be integers, not float

Ancak burada, dizileri işlemek için dahili olarak numpy]2 kullanan matplotlib kullanıyor gibi görünüyorsunuz. Numpy` için [kod tabanında] daha derine indiğimizde şunu görüyoruz:

static NPY_INLINE npy_intp
unpack_tuple(PyTupleObject *index, PyObject **result, npy_intp result_n)
{
    npy_intp n, i;
    n = PyTuple_GET_SIZE(index);
    if (n > result_n) {
        PyErr_SetString(PyExc_IndexError,
                        "too many indices for array");
        return -1;
    }
    for (i = 0; i < n; i++) {
        result[i] = PyTuple_GET_ITEM(index, i);
        Py_INCREF(result[i]);
    }
    return n;
}

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çin IndexError yükseltir.

Yorumlar (0)