与numpy dtypes的c风格联合?

时间:2013-01-14 09:45:01

标签: numpy union

我对使用有些不均匀数据类型的numpy数组感兴趣。由于numpy指定数据必须是同质的,因此可以通过定义一个super-dtype来完成,该super-dtype充当所有子dtypes上的联合包装器。访问子数据类型的字段然后对基础数据进行不同的解释。

已经有了一些设施,例如

dtype(('|S2', [('x', '|i1'), ('y', '|i1')]))

指的是一个双字节字符串数组,但第一个和第二个字节也可以通过“x”和“y”字段名称解释为整数。但是,我无法弄清楚如何为两字节字符串分配字段标签。

这可以更通用,以便我们可以在数据上叠加任意数量的不同字段规范吗?

我的第一次尝试是在dtype中指定字段偏移,但它失败了,并且抱怨必须对偏移进行排序(即非重叠数据)。

dtype1 = np.dtype(dict(
   names=['a','b'], 
   formats=['|a2','<i2'], 
   offsets=[0,0]))

另一项技术有效,但很麻烦。在这种技术中,我可以将几个变量定义为对相同底层数据的视图,并更改不同变量的dtype,以便让我以不同的格式访问数据,即

a=np.zeros(3, dtype='<a2')
b=a[:]
b.dtype='<i2'

这允许我以字符串或整数的形式访问数据,具体取决于我是在查看a还是b。但这是一种操纵数据的繁琐方式。理想情况下,我希望能够指定具有任意偏移的各种不同字段。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:5)

自2011年6月以来,联盟dtypes已被允许:https://github.com/numpy/numpy/pull/94

您需要升级到NumPy 1.7.x才能使用它。

但是,在以前的版本中,您可以使用overlay dtype构造函数:

>>> a = np.zeros(3, dtype=np.dtype(('<i2', [('a', '|a2')])))
>>> a[0] = 0x3456
>>> a['a'][0]
'V4'

这是http://docs.scipy.org/doc/numpy-dev/reference/arrays.dtypes.html#specifying-and-constructing-data-types记录的(搜索(base_dtype, new_dtype))。