このようなスレッドがたくさんあることは知っていますが、そのすべてが3x3の行列などの非常に単純なケースのもので、その解決策は私の状況には当てはまりません。 そこで、G対L1(11ではなく、L1)のグラフを作成しようとしています。データはエクセルファイルから読み込んだファイルの中にあります。エクセルファイルは14x250なので、14個の引数があり、それぞれ250個のデータポイントを持っています。 他のユーザー(Hugh Bothwell氏に感謝!)に私のコードのエラーを助けてもらったのですが、今度は別のエラーが表面化しました。
そこで、問題のコードを紹介します。
# 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)
プログラム全体を実行すると、エラーメッセージが表示されます。
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
また、この問題に遭遇する前に、上記エラーメッセージの数行下の行で別の問題が発生しました。
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
1つ目のエラーは理解していますが、それを解決するのに問題があります。 しかし、2つ目のエラーは私を混乱させます。 私の上司は本当に私の首を絞めているので、何か助けがあれば非常にありがたいです。
私は、問題はエラーメッセージの中にあると思いますが、それを見つけるのはとても簡単ではありません。
IndexError: too many indices for array
xs = data[:, col["l1" ]]
'Too many indices'は、インデックス値を与えすぎていることを意味します。 データが2次元配列であることを想定しているので、2つの値を与えています。 Numpyが文句を言っているのは、data
が2Dではないからです(1DかNoneのどちらかです)。
これはちょっとした推測ですが、loadfile()に渡したファイル名の1つが空のファイルを指していたり、フォーマットの悪いファイルを指していたりしないでしょうか? もしそうなら、1次元か、あるいは空の配列が返されるかもしれません(np.array(None)
はError
をスローしないので、わからないと思いますが...)。 このような失敗を防ぎたい場合は、loadfile
関数にエラーチェックを入れることができます。
私はfor
ループの中に挿入することを強くお勧めします。
print(data)
これは Python 2.x または 3.x で動作し、問題の原因を明らかにするかもしれません。 問題が発生しているのは、outputs_l1
リストの1つの値(つまり1つのファイル)だけであることがわかるかもしれません。
表示されているメッセージは、PythonのデフォルトのExceptionに対するものではありません。
新鮮なPythonリストの場合、IndexError
はインデックスが範囲内にない場合にのみ投げられます(docsにもそう書かれています)。
>>> l = []
>>> l[1]
IndexError: list index out of range
リストに複数のアイテムを渡したり、他の値を渡そうとすると、TypeError
が発生します。
>>> l[1, 2]
TypeError: list indices must be integers, not tuple
>>> l[float('NaN')]
TypeError: list indices must be integers, not float
しかし、ここでは、配列の処理に内部でnumpy
を使用しているmatplotlib
を使用しているようです。numpy`のコードベース]3を詳しく調べてみると、次のようになっています。
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;
}
ここで、unpackメソッドは、インデックスのサイズが結果のサイズよりも大きい場合、エラーを投げます。
このように、不正なインデックスに対して TypeError
を発生させる Python とは異なり、Numpy は多次元配列をサポートしているため、IndexError
を発生させます。