为什么对象dtype数组包含datetime.datetime对象而不是numpy.datetime64对象?

如何解决为什么对象dtype数组包含datetime.datetime对象而不是numpy.datetime64对象?

我不明白为什么我的numpy数组将numpy.datetime64中的dts值存储为datetime.datetime对象。

In [1]: import numpy as np
In [2]: import datetime
In [3]: arr = np.ones((3,),dtype='O') 
In [4]: dts = np.array([np.datetime64(datetime.datetime.today())] * 2)
In [5]: dts
Out[5]: 
array(['2020-08-20T14:44:03.945058','2020-08-20T14:44:03.945058'],dtype='datetime64[us]')
In [6]: arr[:2] = dts 
In [7]: arr                                                                     
Out[7]: 
array([datetime.datetime(2020,8,20,14,44,3,945058),datetime.datetime(2020,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'),dtype=object)

在给定dtsarr的情况下,为什么第一种方法不存储object中确切的对象类型?

解决方法

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,940815)]

dts数组转换为对象类型还将元素转换为datetime

In [387]: dts.astype(object)[0]                                                                      
Out[387]: datetime.datetime(2020,940815)

因此arr[:]= dts必须通过tolistastype(object)

In [349]: dts[0]                                                                                     
Out[349]: numpy.datetime64('2020-08-20T14:46:12.940815')
In [350]: arr = np.ones(2,object)                                                                   
In [351]: arr[:] = dts                                                                               
In [352]: arr                                                                                        
Out[352]: 
array([datetime.datetime(2020,940815)],dtype=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

分配单个项目会保留dtype:

In [365]: arr[0] = x[0]                                                                              
In [366]: arr                                                                                        
Out[366]: array([1.23,dtype=object)
In [367]: type(arr[0])                                                                               
Out[367]: numpy.float64
In [368]: type(arr[1])                                                                               
Out[368]: float

arr现在包含一个np.float64和一个float

请记住,对象dtype数组存储对对象的引用-内存中其他位置的对象。在这方面,它很像一个列表。另一方面,数字dtype数组存储字节,这些字节由dtype机制解释。 dts[0]实际上没有引用dts的8字节块;这是一个新的datetime64对象。 arr[0](在上面的代码中)是另一个datetime64对象(具有相同的值)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?