【问题标题】:numpy too many indices for array errornumpy 数组错误的索引过多
【发布时间】:2014-11-17 06:35:55
【问题描述】:

我有一个具有以下格式的 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', '

谁能给点建议,先谢谢了!

【问题讨论】:

  • 你没有告诉我们足够的信息继续下去。此处发布的代码对于二维数组非常有用。 (这以简单的方式执行相同的操作,并且工作正常:a = numpy.arange(15).reshape(5, 3); li = a[:,0] > a[2][0]; a[li]。)
  • 这个“对象”的形状和数据类型是什么?
  • shape = (128,) type = [('Date', 'O'), ('SF1.AAPL_DEBT_MRQ - Value', '

标签: python arrays numpy


【解决方案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]: 

【讨论】:

  • 感谢您的回复,当我尝试做类似的事情时,我收到以下消息:'datetime.datetime' object has no attribute 'getitem'
  • 好吧,我们正在接近目标!您可以使用成员符号从 datetime.datetime 对象中获取年份(或其他)。如果我上面的x[0],在列表理解中,是我会写的日期时间x[0].year &lt; 2014(请注意,这是一个整数比较!)。你能在你的代码中测试一下吗?
  • 是的,我在 30 分钟前就这样做了,而且效果很好!伟大的思想都一样:)
  • 或阅读相同的参考文献...好的,很高兴能帮上忙,ciao
  • 只是对您所做的工作进行了一些调试,并阅读了一些文档,grazi ciao!
【解决方案2】:

这看起来像一个结构化数组,很可能是通过从csv(使用np.genfromtxt)读取数据创建的。如果是这样,它可能是一维的,带有复杂的dtype。假设第一个字段称为“日期”,那么您可以获得所有日期的数组

myData['Date']

第一行的数据是

myData[0]

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


如我所料,这是一个一维结构化数组:

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

'O' 表示日期是一个对象,可以是任何东西,所以我不能说它的格式或内容。

试试:

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

这至少应该使索引正确。我猜每个“日期”都有一个“年份”属性,可以与“2005”进行比较。这应该给出一个 128 长的 True/False 列表。

尝试使用:

myData[li]

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


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

numpy 具有可用于比较的datetime64 类型:

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')])

【讨论】:

  • 我可以访问日期,我想要的是过滤掉特定日期的字段并从那里开始处理结构。上面指定了Dtype
  • 它肯定是一个日期对象,但这并不能真正回答关于仅获取特定日期的过滤行的问题
  • 那更接近了,但是当我按照您的建议尝试 print myData[li,:] 时,我仍然收到此消息:/Library/Python/2.7/site-packages/numpy-1.9.1-py2 .7-macosx-10.9-intel.egg/numpy/core/records.py:458:FutureWarning:将来,布尔数组喜欢将被处理为布尔数组索引 obj = ndarray.__getitem__(self, indx)数组的许多索引
  • 不要使用 2 个索引访问 myDatamyData[li] 应该是使用布尔索引列表的正确方法。
  • 越来越近了,但是当我做类似 li = [date.year == 2005 for date in myData['Date']] 之类的事情时,我会多次输出同一行(datetime.datetime( 2004, 1, 30, 0, 0),南,南,南,南,南,南,南,南,南,南,1.61142857,南,南,南)]
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2015-09-09
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多