我试图从一个空的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
答案 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
。但这通常与数组的目的相矛盾。