2016-10-25 84 views
0

我试图对numpy类型执行有效性检查 - 具体地说,如果np.longdouble是80位扩展精度浮点型并获取其原始字节大小(使用填充)。获取有关numpy dtype的信息

通过dtype docs可以得到一大堆来自属性的信息。但是,无论我检查的属性,我得到

In [23]: np.longdouble.nbytes 
Out[23]: <attribute 'nbytes' of 'numpy.generic' objects> 

而不是数字。

我可以从np.finfo(np.longdouble)得到一大堆信息,但它不包含字节大小。

当然,我可以创建一个这种类型的数组,并计算大小或其他...但是这真的有必要获得不绑定到特定实例的信息吗?

+1

这会帮助吗? - http://stackoverflow.com/questions/16972501/numpy-size-of-data-type – Divakar

回答

2

根据Numpy size of data type,需要np.dtype(<type>)才能真正得到真实的属性值。奇怪的!

这里(使用dump模块):

In [27]: dump(np.dtype(np.longdouble)) 
alignment : 8 
base : float64 
byteorder : = 
char : g 
descr : [('', '<f8')] 
fields : None 
flags : 0 
hasobject : False 
isalignedstruct : False 
isbuiltin : 1 
isnative : True 
itemsize : 8 
kind : f 
metadata : None 
name : float64 
names : None 
num : 13 
shape :() 
str : <f8 
subdtype : None 
type : <type 'numpy.float64'> 

该输出是从上win32平台的Python 2.7和,predictablynp.longdouble是双而非扩展精度这里。

为了便于比较,这里有来自86 CentOS 6的输出它的扩展:

alignment : 4 
base : float96 
byteorder : = 
char : g 
descr : [('', '<f12')] 
fields : None 
flags : 0 
hasobject : False 
isbuiltin : 1 
isnative : True 
itemsize : 12 
kind : f 
metadata : None 
name : float96 
names : None 
num : 13 
shape :() 
str : <f12 
subdtype : None 
type : <type 'numpy.float96'> 
+0

你正在运行什么版本? OS?我的Linux 3.5+上的项目大小为12。 – hpaulj

+0

在win32上@hpaulj 2.7。输出仅仅是一个例子 - 我不想在各种平台上混淆所有可能输出的答案。我已经添加了一个注释来达到这个效果。毕竟,问题只是获取值而不是验证'np.longdouble'为80位的所有方面。 –

2

去实例路线:

In [1586]: np.array(1,np.longdouble) 
Out[1586]: array(1.0, dtype=float96) 
In [1587]: np.longdouble(1).nbytes 
Out[1587]: 12 

In [1588]: np.dtype(np.longdouble) 
Out[1588]: dtype('float96') 

默认的浮动是float64

nbytes是实例的属性,而不是类的属性。这种区别在Python中很常见。

如果让我从它dtype对象:

In [1592]: dt=np.dtype(np.longdouble) 
In [1593]: dt 
Out[1593]: dtype('float96') 
In [1594]: dt.descr 
Out[1594]: [('', '<f12')] 
In [1595]: dt.itemsize 
Out[1595]: 12 

np.typeDict地图代码的类型。类型名称通常表示大小。

In [1600]: np.typeDict['longdouble'] 
Out[1600]: numpy.float96 

===================

finfo开始与np.dtype(dtype)。所以dt.itemsize是获得这种类型字节大小的正确方法。

由于dtypes有很多同义词,因此使用像np.dtype这样的“中央结算所”是有意义的。而且对编译器有一定的依赖性,所以有些属性必须在运行时导出,而不是在某些python类定义中进行硬编码。

+0

注意:'typeDict'没有记录。 –

+1

'github'搜索不显示任何文档参考。但它是在'numpy/numpy/core/numerictypes.py'中创建的 – hpaulj