Python 为什么对象数据类型数组包含datetime.datetime对象而不是numpy.datetime64对象?
我不明白为什么我的numpy数组将Python 为什么对象数据类型数组包含datetime.datetime对象而不是numpy.datetime64对象?,python,arrays,numpy,datetime,Python,Arrays,Numpy,Datetime,我不明白为什么我的numpy数组将numpy.datetime 64值存储在dts中,作为datetime.datetime对象 [1]中的:将numpy作为np导入 在[2]中:导入日期时间 在[3]中:arr=np.one((3,),dtype='O') 在[4]中:dts=np.array([np.datetime64(datetime.datetime.today())]*2) In[5]:dts 出[5]: 数组(['2020-08-20T14:44:03.945058','2020-
numpy.datetime 64
值存储在dts
中,作为datetime.datetime
对象
[1]中的:将numpy作为np导入
在[2]中:导入日期时间
在[3]中:arr=np.one((3,),dtype='O')
在[4]中:dts=np.array([np.datetime64(datetime.datetime.today())]*2)
In[5]:dts
出[5]:
数组(['2020-08-20T14:44:03.945058','2020-08-20T14:44:03.945058'],
dtype='datetime64[us]')
在[6]中:arr[:2]=dts
在[7]中:arr
出[7]:
数组([datetime.datetime(2020,8,20,14,44,3945058),
datetime.datetime(2020,8,20,14,44,3945058),1],dtype=object)
我已经能够使用下面的代码解决这个问题,但我的实际情况更复杂,我更愿意使用上面的方法
In [8]: arr = np.ones((3,), dtype='O')
In [9]: dts = np.array([np.datetime64(datetime.datetime.today())] * 2)
In [10]: for i in [0, 1]:
...: arr[i] = dts[i]
In [11]: arr
Out[11]:
array([numpy.datetime64('2020-08-20T14:53:20.878553'),
numpy.datetime64('2020-08-20T14:53:20.878553'), 1], dtype=object)
为什么第一种方法不存储给定的arr
isobject
dtype中的确切对象类型
In [346]: dts = np.array([np.datetime64(datetime.datetime.today())] * 2)
In [347]: dts
Out[347]:
array(['2020-08-20T14:46:12.940815', '2020-08-20T14:46:12.940815'],
dtype='datetime64[us]')
tolist
将数组转换为列表,尽可能将元素呈现为基本Python对象-显然datatime64
被编程为将自身呈现为datetime
对象:
In [348]: dts.tolist()
Out[348]:
[datetime.datetime(2020, 8, 20, 14, 46, 12, 940815),
datetime.datetime(2020, 8, 20, 14, 46, 12, 940815)]
将dts
数组转换为对象类型也会将元素转换为datetime
:
In [387]: dts.astype(object)[0]
Out[387]: datetime.datetime(2020, 8, 20, 14, 46, 12, 940815)
因此,arr[:]=dts
必须通过tolist
或astype(object)
浮动也会发生类似的情况:
In [360]: x = np.array([1.23, 23.2])
In [361]: type(x[0])
Out[361]: numpy.float64
In [362]: arr[:] = x
In [363]: arr
Out[363]: array([1.23, 23.2], dtype=object)
In [364]: type(arr[0])
Out[364]: float
分配单个项将保留数据类型:
In [365]: arr[0] = x[0]
In [366]: arr
Out[366]: array([1.23, 23.2], dtype=object)
In [367]: type(arr[0])
Out[367]: numpy.float64
In [368]: type(arr[1])
Out[368]: float
arr
现在包含一个np.float64
和一个float
请记住,对象数据类型数组存储对对象的引用,即内存中其他位置的对象。在这方面,它很像一个列表。另一方面,数字数据类型数组存储字节,字节由
dtype
机制解释dts[0]
实际上并不引用dts
的8字节块;这是一个新的datetime64
对象。arr[0]
(在上面的代码中)是另一个datetime64
对象(具有相同的值)。你问它有没有什么方法可以避免的循环以得到我想要的结果?@dshanahan你有没有理由使用dtype='O'
?您是否可以使用结构化数组,前两列使用实数numpy datetime64?
In [365]: arr[0] = x[0]
In [366]: arr
Out[366]: array([1.23, 23.2], dtype=object)
In [367]: type(arr[0])
Out[367]: numpy.float64
In [368]: type(arr[1])
Out[368]: float