【问题标题】:c-style union with numpy dtypes?c 风格的联合与 numpy dtypes?
【发布时间】:2013-01-14 09:45:00
【问题描述】:

我对使用有些不均匀数据类型的 numpy 数组很感兴趣。由于 numpy 指定数据必须是同质的,这将通过定义一个超级 dtype 来实现,该超级数据类型充当所有子 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,以字符串或整数的形式访问数据。但这是一种操作数据的繁琐方式。理想情况下,我希望能够指定具有任意偏移量的各种不同字段。有没有办法做到这一点?

【问题讨论】:

    标签: numpy union


    【解决方案1】:

    自 2011 年 6 月起允许使用联合数据类型:https://github.com/numpy/numpy/pull/94

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

    但是,在以前的版本中,您可以使用覆盖 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))。

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2011-07-16
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      相关资源
      最近更新 更多