【问题标题】:PYTHON/NUMPY: How to assign various data types to the data type object numpy.dtype() in a loopPYTHON/NUMPY:如何在循环中将各种数据类型分配给数据类型对象numpy.dtype()
【发布时间】:2017-03-07 18:00:00
【问题描述】:

我想使用 numpy.dtype() 对象构造一个具有各种不同数据类型的 numpy-array。

我有一个字典“mydict”,其中存储了有关数据的所有信息,我想用它创建一个数据类型对象dt。 'mydict' 是根据我选择的属性动态创建的,并且数据类型也对应于属性!

import numpy as np

mydict={'name0': 'mass', 'name1': 'position', 'name2': 'ID', 
      'format0': np.float32, 'format1': np.int8, 'format2': np.uint64}

数据类型对象dt 应如下所示

dt = np.dtype([('mass', np.float32), ('position', np.int8), ('ID', np.uint64)])

我的问题是如何创建dt 而无需手动构建/写入代码?

主要问题是我不知道如何在 np.dtype() 后面加上另一个“名称”和“格式”组合的条目,或者即使有可能......

我正在使用 dt 然后将我的数据读入这样的 numpy 数组!

data_array=np.array((nr_rows, nr_cols)), dtype=dt)

我尝试使用 Dict Comprehensions、列表和字典进行某些尝试,但我找不到正确的方法。

【问题讨论】:

  • 你从哪里得到dict?您可能希望在构建它时考虑到您想要的dtype,这样您就不必重新构建它。
  • @Psidom:嗨,是的,我想这样做,这个字典只是一个例子!
  • dict 的键是否遵循您所显示的模式? name[0-9] 和 format[0-9].
  • @Psidom:没错!

标签: python arrays numpy dictionary


【解决方案1】:
In [209]: dd={'name0': 'mass', 'name1': 'position', 'name2': 'ID', 
     ...:       'format0': np.float32, 'format1': np.int8, 'format2': np.uint64}

In [213]: [(dd['name%s'%i],dd['format%s'%i]) for i in range(3)]
Out[213]: [('mass', numpy.float32), ('position', numpy.int8), ('ID', numpy.uint64)]

In [214]: dt=np.dtype([(dd['name%s'%i],dd['format%s'%i]) for i in range(3)])
In [216]: arr = np.zeros((2,), dt)
In [217]: arr
Out[217]: 
array([( 0., 0, 0), ( 0., 0, 0)], 
      dtype=[('mass', '<f4'), ('position', 'i1'), ('ID', '<u8')])

【讨论】:

    【解决方案2】:

    如果您的密钥遵循问题中的严格模式,您可以看看这个; 1) 提取键以 name 开头的值,并将它们设置为元组的第一个元素; 2)将name替换为format,并提取对应的值作为元组的第二个元素; 3) 从元组列表中构造数据类型。

    import numpy as np
    np.dtype([(d[k], d[k.replace('name', 'format')]) for k in d.keys() if k.startswith('name')])
    
    # dtype([('position', 'i1'), ('ID', '<u8'), ('mass', '<f4')])
    

    注意:您最初可能需要OrderDict 才能在此处获得正确的列顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多