我制作了一个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]
这样的列。
答案 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.)