结构化numpy数组中的0列是什么?

时间:2017-10-25 14:56:13

标签: python numpy

我制作了一个numpy结构化数组,但结构与我想象的不同。

>>> data = np.zeros(3, dtype=[('date', 'datetime64[ms],i4'), ('price', np.float32)])

>>> data
array([(('1970-01-01T00:00:00.000', 0),  0.),    
       (('1970-01-01T00:00:00.000', 0),  0.), 
       (('1970-01-01T00:00:00.000', 0),  0.)], 
       dtype=[('date', [('f0', '<M8[ms]'), ('f1', '<i4')]), ('price', '<f4')])

我想知道日期列旁边的0值是什么。即使我在列中添加了新值,我也必须澄清它,我不明白为什么。

data[0][0] = (np.datetime64('2017-10-24 01:00:07.870000'), 0) - &gt;作品

data[0][0] = np.datetime64('2017-10-24 01:00:07.870000') - &gt;得到错误的值

array([(('49782-03-08T18:11:10.000', 0),  0.),
     (('1970-01-01T00:00:00.000', 0),  0.),
     (('1970-01-01T00:00:00.000', 0),  0.)],
     dtype=[('date', [('f0', '<M8[ms]'), ('f1', '<i4')]), ('price', '<f4')])

有人可以向我解释它们的用途吗?我想知道如何在结构化数组中选择data[:,0]这样的列。

2 个答案:

答案 0 :(得分:1)

这是因为你在这里嵌套了三个级别:

In [644]: data[0]
Out[644]: (('1970-01-01T00:00:00.000', 0),  0.)

In [645]: data[0][0]
Out[645]: ('1970-01-01T00:00:00.000', 0)

In [646]: data[0][0][0]
Out[646]: numpy.datetime64('1970-01-01T00:00:00.000')

您可以通过以下方式进行设置:

In [647]: data[0][0][0]=datetime64('2017-01-01T00:00:00.000')

答案 1 :(得分:1)

按名称访问和设置字段:

In [16]: data = np.zeros(3, dtype=[('date', 'datetime64[ms],i4'), ('price', np.f
    ...: loat32)])
In [17]: data
Out[17]: 
array([(('1970-01-01T00:00:00.000', 0),  0.),
       (('1970-01-01T00:00:00.000', 0),  0.),
       (('1970-01-01T00:00:00.000', 0),  0.)],
      dtype=[('date', [('f0', '<M8[ms]'), ('f1', '<i4')]), ('price', '<f4')])
In [18]: data['price']=[1,3,4]
In [19]: data['date']['f1']=12
In [21]: data
Out[21]: 
array([(('1970-01-01T00:00:00.000', 12),  1.),
       (('1970-01-01T00:00:00.000', 12),  3.),
       (('1970-01-01T00:00:00.000', 12),  4.)],
      dtype=[('date', [('f0', '<M8[ms]'), ('f1', '<i4')]), ('price', '<f4')])

访问特定记录(元素)的字段:

In [22]: data['price'][0]
Out[22]: 1.0
In [23]: data['price'][[1,2]]
Out[23]: array([ 3.,  4.], dtype=float32)

但是让我们放弃无用的i4字段

In [29]: data = np.zeros(3, dtype=[('date', 'datetime64[ms]'), ('price', np.float32)])
In [30]: data
Out[30]: 
array([('1970-01-01T00:00:00.000',  0.), ('1970-01-01T00:00:00.000',  0.),
       ('1970-01-01T00:00:00.000',  0.)],
      dtype=[('date', '<M8[ms]'), ('price', '<f4')])

现在我们可以为date字段

指定值
In [31]: data['date']=[1,2,3]     # ms
In [32]: data
Out[32]: 
array([('1970-01-01T00:00:00.001',  0.), ('1970-01-01T00:00:00.002',  0.),
       ('1970-01-01T00:00:00.003',  0.)],
      dtype=[('date', '<M8[ms]'), ('price', '<f4')])

In [33]: data['date']=np.array([1,2,3],dtype='datetime64[Y]') # years
In [34]: data
Out[34]: 
array([('1971-01-01T00:00:00.000',  0.), ('1972-01-01T00:00:00.000',  0.),
       ('1973-01-01T00:00:00.000',  0.)],
      dtype=[('date', '<M8[ms]'), ('price', '<f4')])

单一日期:

In [35]: data['date'][2] = np.array('2017-10-31', 'datetime64[D]')
In [36]: data[2]
Out[36]: ('2017-10-31T00:00:00.000',  0.)