Используйте идиому zip*
, чтобы «транспонировать» ваш список кортежей:
In [150]: alist = [(0,1,2,3,4),tuple('abcde'),(.1,.2,.4,.6,.8)]
In [151]: alist
Out[151]: [(0, 1, 2, 3, 4), ('a', 'b', 'c', 'd', 'e'), (0.1, 0.2, 0.4, 0.6, 0.8)]
In [152]: dt = np.dtype([('0',int),('1','U3'),('2',float)])
In [153]: list(zip(*alist))
Out[153]: [(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6), (4, 'e', 0.8)]
In [154]: np.array(_, dt)
Out[154]:
array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
(4, 'e', 0.8)], dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])
Существует также создатель recarray
, который принимает список массивов:
In [160]: np.rec.fromarrays(alist,dtype=dt)
Out[160]:
rec.array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
(4, 'e', 0.8)],
dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])
Существует также модуль numpy.lib.recfunctions
(импорт отдельно), который имеет функции recarray, structured array
.
Как прокомментировано:
In [169]: np.fromiter(zip(*alist),dt)
Out[169]:
array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
(4, 'e', 0.8)], dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])