2011-06-09 140 views
2

的我正在使用此代码:NumPy的指数超出范围错误

r = mlab.csv2rec(datafile, delimiter=';') 

fig = plt.figure() 
fig.subplots_adjust(bottom=0.2) 
ax = fig.add_subplot(111) 
ax.plot(r.date, r.close) 

但它返回这样的:

ax.plot(r.date, r.close)

IndexError: index out of range for array

如何确保我真的住在阵列范围之内?

如果打印出LEN(r.date)和len(r.close)它们都返回:500


EDIT,这是从一个matplotlib示例代码,使用NPY文件,我倒是想为电子CSV文件做同样的:

datafile = cbook.get_sample_data('goog.npy') 
r = np.load(datafile).view(np.recarray) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(r.date, r.adj_close) 

编辑,完整的错误日志:

Traceback (most recent call last): 
    File "main02.py", line 66, in <module> 
    ax.plot(r['date'], r['close']) 
    File "/usr/lib/python2.6/site-packages/matplotlib/axes.py", line 3788, in plot 
    self.autoscale_view(scalex=scalex, scaley=scaley) 
    File "/usr/lib/python2.6/site-packages/matplotlib/axes.py", line 1824, in autoscale_view 
    y0, y1 = ylocator.view_limits(y0, y1) 
    File "/usr/lib/python2.6/site-packages/matplotlib/ticker.py", line 1170, in view_limits 
    return np.take(self.bin_boundaries(dmin, dmax), [0,-1]) 
    File "/film/tools/PythonExtensions/v41/py26_linux-x64/numpy/core/fromnumeric.py", line 103, in take 
    return take(indices, axis, out, mode) 
IndexError: index out of range for array 
+0

嗯。我刚刚生成了一个包含500行的测试csv数据文件,标记为date和close的列以及分号分隔符,上述内容适用于我。 – DSM 2011-06-09 06:39:22

+0

嗯,它会与这个文件? http://db.tt/MIOqFA0 – 2011-06-09 06:48:28

回答

4

好的,我可以绘制原始数据集没有错误 - 但我认为它是真正DD/MM/YYYY时将日期信息误解为MM/DD/YYYY。

这是我得到的原始代码:

bad date plot

这里就是我得到的,当我修复日期:

import datetime 
fixdate = lambda d: datetime.datetime.strptime(d, '%d/%m/%Y') 
r = mlab.csv2rec(datafile, delimiter=';', converterd={0: fixdate}) 

good plot

所以,如果我不得不猜测,我会说你的matplotlib版本拒绝不可能的日期,所以它认为你的r.date列有更少的“真正的”val比它应该。由于我无法重现错误,所以很难确定。

你可以尝试上面的日期时间修改?

+0

试图你的修改,仍然是同样的问题,我是会尝试其他系统 – 2011-06-09 08:08:47

+0

这就排除了我的理论,但是你的matplotlib和我的理论之间肯定有不同。我认为你没有做错什么。 – DSM 2011-06-09 08:31:02

+0

这是安装.. – 2011-06-09 11:16:20

1

我想你想绘制你的csv文件的数据,对吧? 我的问题是,我认为你不会访问你的数据r.dater.close。您的r是一个包含您的数据的数组,您不需要绘制数据的方法。

如果可以的话,你可以发送一些文件的行,我可以检查它?

问候

编辑

它比我想象中的简单。将r.date替换为r['date']r.closer['close']。 这应该工作。

使用命令mlab.csv2rec加载csv文件。我提到matplotlib使用numpy。加载数据后,可以使用字段名称访问数据。名字由第一行定义(针对您的情况)。如果你想更多地了解这一点。您可以通过谷歌numpy.dtypes获取有关字段的快速教程。 如果您需要更多信息或帮助,我将很乐意提供帮助。

+0

当然,你可以在这里找到csv:http://db.tt/MIOqFA0。我正在查看一个matplotlib示例文件,这就是他们如何绘制数据(使用npy文件)。编辑上面 – 2011-06-09 06:37:03

+0

奇怪,我得到相同的错误,也许别的东西出错了,我正在编辑与完整的错误日志 – 2011-06-09 07:00:01

+0

问题我没有一个'r.date'和'r.close'作为'r'的方法。 – ahelm 2011-06-09 07:00:18