如何创建空的numpy数组来存储不同类型的数据

时间:2016-10-15 13:28:26

标签: python numpy

我试图从一个空的numpy数组开始。随着代码的进展,第一列应填充datetime.datetime,第二列应填充str,第三列填充float,第四列填充int

我尝试了以下内容:

A = np.empty([10, 4])
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0)

我收到错误:

TypeError: float() argument must be a string or a number

2 个答案:

答案 0 :(得分:3)

结构化阵列方法:

根据您的列规范定义dtype:

In [460]: dt=np.dtype('O,U10,f,i')
In [461]: from datetime import datetime

初始化一个空数组,包含3个元素(不是3x4)

In [462]: A = np.empty((3,), dtype=dt)
In [463]: A
Out[463]: 
array([(None, '', 0.0, 0), (None, '', 0.0, 0), (None, '', 0.0, 0)], 
      dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')])

填写一些值 - 按字段名称(不是列号)

In [464]: A['f1']=['one','two','three']
In [465]: A['f0'][0]=datetime(2016, 10, 1, 1, 0)    
In [467]: A['f2']=np.arange(3)
In [468]: A
Out[468]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0),
       (None, 'two', 1.0, 0), 
       (None, 'three', 2.0, 0)], 
      dtype=[('f0', 'O'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')])

查看此数组的元素:

In [469]: A[0]
Out[469]: (datetime.datetime(2016, 10, 1, 1, 0), 'one', 0.0, 0)

我选择创建第一个字段object dtype,因此它可以容纳一个datetime对象 - 这不是数字或字符串。

np.datetime64将日期存储为浮点数,并提供datetime个对象不具备的许多功能:

In [484]: dt1=np.dtype('datetime64[s],U10,f,i')
In [485]: A1 = np.empty((3,), dtype=dt1)
In [486]: A1['f0']=datetime(2016, 10, 1, 1, 0)
In [487]: A1['f3']=np.arange(3)
In [488]: A1
Out[488]: 
array([(datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 0),
       (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 1),
       (datetime.datetime(2016, 10, 1, 1, 0), '', 0.0, 2)], 
      dtype=[('f0', '<M8[s]'), ('f1', '<U10'), ('f2', '<f4'), ('f3', '<i4')])

第三种方法是使整个数组对象成为dtype。这实际上是一个美化的名单。许多操作采用普通迭代,或者只是没有实现。它更通用,但你失去了普通数字数组的许多功能。

答案 1 :(得分:2)

您可以使用dtype=object

A = np.empty([10, 4], dtype=object)
A[0][0] = datetime.datetime(2016, 10, 1, 1, 0)

也可以使用结构化数组,但是对于字符串对象,您有一个固定的长度。如果您需要任意大对象,则必须使用dtype=object。但这通常与数组的目的相矛盾。