Skip to main content
 首页 » 编程设计

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

2025年05月04日13JeffreyZhao

我试图从一个空的 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 

请您参考如下方法:

结构化数组方法:

根据您的列规范定义数据类型:

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 将日期存储为 float ,并提供许多 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。这实际上是一个美化的 list 。许多操作诉诸于简单的迭代,或者只是没有实现。它更通用,但您失去了普通数值数组的很多功能。