2017-03-07 47 views
1

我想使用numpy.dtype()對象構造具有各種不同數據類型的numpy數組。PYTHON/NUMPY:如何在循環中爲數據類型對象numpy.dtype()分配各種數據類型

我有一個字典'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

的主要問題是,我不知道如何與「名」和「格式」的組合或其它條目如果這甚至有可能...

我使用dt然後閱讀追加np.dtype()我的數據變成了一個像這樣的numpy數組!

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

我嘗試過使用詞典理解,列表和詞典的某些嘗試,但我找不到正確的方法來做到這一點。

+0

你從哪裏得到'dict'?你可能想用你想要的'dtype'來構造它,這樣你就不必重構它了。 – Psidom

+0

@Psidom:嗨,是的,我想這樣做,這個詞典只是一個例子! – firefly2517

+0

「dict」的關鍵字是否跟隨着您展示的模式? 'name [0-9]'和'format [0-9]'。 – Psidom

回答

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')]) 
+0

謝謝,它正在工作! – firefly2517

0

如果你的鑰匙遵循嚴格的模式在這個問題,你可以看看這個, 1)提取鍵值以名稱開頭,並將它們設置爲元組的第一個元素; 2)將的名稱替換爲的格式,並提取相應的值作爲元組的第二個元素; 3)從元組列表構造dtype。

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最初是爲了有列的正確順序這裏。

+0

謝謝!這是工作 :-) – firefly2517