numpy数组错误的索引太多了

时间:2014-11-15 21:28:02

标签: python arrays numpy

我有一个numpy对象,格式如下:

date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
...

我试图只检索满足特定日期条件的行,例如日期大于2005的所有行,如下所示(myData是一个numpy对象):

li = (myData[:,0] >  myData[2][0].year)

但是我一直收到以下错误:

too many indices for array,

形状是(128,) dtype是[('Date','O'),('SF1.AAPL_DEBT_MRQ - Value','

有人可以提前告知,谢谢!

2 个答案:

答案 0 :(得分:1)

这是建立在@hpaulj的答案之上的,我添加的缺失步骤是将布尔值列表转换为ndarray

% cat puff.csv
date,pippo,pluto,paperino
2012-10-20,3.,5.,6.
2013-05-22,4.,6.,2.
2013-07-31,5.,1.,6.
2014-10-08,0.,3.,4.
% ipython
Python 2.7.8 (default, Oct 18 2014, 12:50:18) 
Type "copyright", "credits" or "license" for more information.

IPython 2.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import numpy as np

In [2]: l = np.genfromtxt('puff.csv', dtype=None,  delimiter=',', skip_header=1)

In [3]: print l
[('2012-10-20', 3.0, 5.0, 6.0) ('2013-05-22', 4.0, 6.0, 2.0)
 ('2013-07-31', 5.0, 1.0, 6.0) ('2014-10-08', 0.0, 3.0, 4.0)]

In [4]: l[np.array([x[0][:4]<'2014' for x in l])]
Out[4]: 
array([('2012-10-20', 3.0, 5.0, 6.0), ('2013-05-22', 4.0, 6.0, 2.0),
       ('2013-07-31', 5.0, 1.0, 6.0)], 
      dtype=[('f0', 'S10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

In [5]: print l[np.array([x[0][:4]<'2014' for x in l])]
[('2012-10-20', 3.0, 5.0, 6.0) ('2013-05-22', 4.0, 6.0, 2.0)
 ('2013-07-31', 5.0, 1.0, 6.0)]

In [6]: 

答案 1 :(得分:0)

这看起来像一个结构化数组,很可能是通过读取csv(带np.genfromtxt)的数据创建的。如果是这样,它可能是一维的复杂dtype。假设第一个字段被称为&#39; Date&#39;,那么您可以使用

获取所有日期的数组
myData['Date']

第一行的数据将是

myData[0]

第一个日期可以是myData[0]['Date']myData['Date'][0]


正如我猜测的那样,这是一个1d结构化数组:

shape = (128,)
type = [('Date', 'O'), ('SF1.AAPL_DEBT_MRQ - Value', '<f8'), ....)] 

'O'表示日期是一个对象,可能是任何东西,所以我无法对其格式或内容说些什么。

尝试:

li = [date.year>2005 for date in myData['Date']

这至少应该使索引正确。我猜测每个&#39; date&#39;有一个&#39;年&#39;可以与&#39; 2005&#39;进行比较的属性。这应该给出128长的真/假列表。

尝试使用:

myData[li]

获取符合条件的行。您可能必须将li转换为数组或索引号列表。但无论如何,myData将始终使用一个值或列表编制索引。 too many indices错误意味着当它实际上只是1d时,你将它视为二维数组。


可以使用字段名称读取gboffi的数据,如

data = np.genfromtxt('puff.csv', dtype=None,  delimiter=',', names=True)

结果为dtype

dtype([('date', 'S10'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])

可以在以下位置找到所需的行:

I=[x[:4]<'2014' for x in data['date']]
# the 'date' field can be selected before or after element selection
# [True, True, True, False]
data[np.array(I)]

numpydatetime64类型,可用于比较:

dates=[np.datetime64(x) for x in data['date']]
I = dates<np.datetime64('2014-01-01')
# array([ True,  True,  True, False], dtype=bool)
data[I]

如果日期格式正确,genfromtxt可以进行字符串到日期转换:

In [206]: data = np.genfromtxt(txt, dtype=('datetime64[D]','f8','f8','f8'),  delimiter=',', names=True)
In [207]: data
Out[207]: 
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
       (datetime.date(2013, 5, 22), 4.0, 6.0, 2.0),
       (datetime.date(2013, 7, 31), 5.0, 1.0, 6.0),
       (datetime.date(2014, 10, 8), 0.0, 3.0, 4.0)], 
      dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])

年份选择可以通过以下方式完成:

In [208]: data[data['date']<np.datetime64('2014','Y')]
Out[208]: 
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
       (datetime.date(2013, 5, 22), 4.0, 6.0, 2.0),
       (datetime.date(2013, 7, 31), 5.0, 1.0, 6.0)], 
      dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])

甚至是日期选择:

In [209]: data[data['date']<np.datetime64('2013-06-01','D')]
Out[209]: 
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
       (datetime.date(2013, 5, 22), 4.0, 6.0, 2.0)], 
      dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])