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

Python 结构化numpy数组中的这列0是什么?,python,numpy,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.), (('1

我制作了一个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')])

谁能给我解释一下它们的用途吗?我想知道如何在结构化数组中选择像
data[:,0]
这样的列。

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

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

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

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

按名称访问和设置字段:

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')])
但是让我们去掉无用的
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')])
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.)

按名称访问和设置字段:

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')])
但是让我们去掉无用的
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')])
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.)

谢谢你的解释。你能告诉我为什么它是必要的,以及我如何在没有它的情况下制作结构化数组吗?我看不出是哪个部分的
data=np.zero(3,dtype=[('date','datetime64[ms],i4'),('price',np.float32)]
成功了。我认为i4在这里没有意义。只要尝试
np.zero(3,dtype=[('date','datetime64[ms]),('price',np.float32)])
,它就会像你想象的那样运行。键入help(numpy.dtype)以获取更多解释。感谢您的解释。你能告诉我为什么它是必要的,以及我如何在没有它的情况下制作结构化数组吗?我看不出是哪个部分的
data=np.zero(3,dtype=[('date','datetime64[ms],i4'),('price',np.float32)]
成功了。我认为i4在这里没有意义。只要尝试
np.zero(3,dtype=[('date','datetime64[ms]),('price',np.float32)])
,它就会像你想象的那样运行。键入help(numpy.dtype)以获取更多解释。您应该按名称对字段进行索引,
data['price']
data['date']['f0']
etc创建表达式中“i4”的用途是什么?@hpaulj感谢您的帮助!我以为i4是datetime选项的一部分。您是否知道在创建结构化数组(例如NaT)时如何初始化默认值?您应该按名称对字段进行索引,
data['price']
data['date']['f0']
etc创建表达式中的'i4'的用途是什么?@hpaulj感谢您的帮助!我以为i4是datetime选项的一部分。您是否知道在创建结构化数组(例如NaT)时如何初始化默认值?