2016-09-14 4 views
2

Я обычно создаю Numpy dtypes так:Как создать numpy dtype из других типов?

C = np.dtype([('a',int),('b',float)]) 

Однако в моем коде я использую поле a и b индивидуально в другом месте:

A = np.dtype([('a',int)]) 
B = np.dtype([('b',float)]) 

Для ремонтопригодности Я хотел бы получить C из типов A и B примерно так:

C = np.dtype([A,B]) # this gives a TypeError 

Есть ли способ numpy создать сложные типы dtypes, объединив другие типы dtypes?

ответ

3

Вы можете комбинировать поля, используя атрибут .descr типов. Например, вот ваши A и B. Обратите внимание, что .descr attrbute представляет собой список, содержащий запись для каждого поля:

In [44]: A = np.dtype([('a',int)]) 

In [45]: A.descr 
Out[45]: [('a', '<i8')] 

In [46]: B = np.dtype([('b',float)]) 

In [47]: B.descr 
Out[47]: [('b', '<f8')] 

Поскольку значения .descr атрибутов списки, они могут быть добавлены, чтобы создать новый DTYPE:

In [48]: C = np.dtype(A.descr + B.descr) 

In [49]: C 
Out[49]: dtype([('a', '<i8'), ('b', '<f8')]) 
+0

Спасибо! Ваш метод более лаконичен, чем мой, используя конкатенации списков. – hazrmard

4

Согласно до dtype documentation, dtypes имеет атрибут descr, который предоставляет «Соответствующее описанию интерфейса Array полное описание типа данных». Поэтому:

A = np.dtype([('a',int)]) # A.descr -> [('a', '<i4')] 
B = np.dtype([('b',float)]) # B.descr -> [('b', '<f8')] 
# then 
C = np.dtype([A.descr[0], B.descr[0]]) 
+0

Хех, штопать рядом с одновременными ответами. :) –

0

Существует модуль подпора в numpy, который имеет кучу структурированного/Rec утилита массива.

zip_descr делает этот вид descr конкатенации, но она начинается с массивами, а не dtypes:

In [77]: import numpy.lib.recfunctions as rf 
In [78]: rf.zip_descr([np.zeros((0,),dtype=A),np.zeros((0,),dtype=B)]) 
Out[78]: [('a', '<i4'), ('b', '<f8')] 
In [81]: rf.zip_descr([np.array((0,),dtype=A),np.array((0,),dtype=B)]) 
Out[81]: [('a', '<i4'), ('b', '<f8')] 

 Смежные вопросы

  • Нет связанных вопросов^_^