Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么对象数据类型数组包含datetime.datetime对象而不是numpy.datetime64对象?_Python_Arrays_Numpy_Datetime - Fatal编程技术网

Python 为什么对象数据类型数组包含datetime.datetime对象而不是numpy.datetime64对象?

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数组将
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
is
object
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