获取有关numpy dtype的信息

时间:2016-10-25 20:48:39

标签: python numpy

我正在尝试对numpy类型执行有效性检查 - 特别是,如果np.longdouble是80位扩展精度浮点数 - 并获得其原始字节大小(使用填充)。

根据dtype docs,我可以从属性中获取大量信息。但是,无论我检查哪个属性,我都会

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

而不是数字。

我可以从np.finfo(np.longdouble)获取大量信息,但不包括字节大小。

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

2 个答案:

答案 0 :(得分: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是双精度而非扩展精度。

为了进行比较,这里是x86 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'>

答案 1 :(得分: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

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

finfonp.dtype(dtype)开头。所以dt.itemsize是获取类似字体大小的正确方法。

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