NumPy: программно изменить dtype структурированного массива

у меня есть структурированный массив, например:

import numpy as np
orig_type = np.dtype([('Col1', '<u4'), ('Col2', '<i4'), ('Col3', '<f8')])
sa = np.empty(4, dtype=orig_type)

здесь sa выглядит (случайные данные):

array([(11772880L, 14527168, 1.079593371731406e-307),
       (14528064L, 21648608, 1.9202565460908188e-302),
       (21651072L, 21647712, 1.113579933986867e-305),
       (10374784L, 1918987381, 3.4871913811200906e-304)], 
      dtype=[('Col1', '<u4'), ('Col2', '<i4'), ('Col3', '<f8')])

теперь, в моей программе, я как-то решаю, что мне нужно изменить тип данных "Col2" на строку. Как я могу изменить dtype для этого, например, непрограммным способом:

new_type = np.dtype([('Col1', '<u4'), ('Col2', '|S10'), ('Col3', '<f8')])
new_sa = sa.astype(new_type)

здесь new_sa теперь похоже, что здорово:

array([(11772880L, '14527168', 1.079593371731406e-307),
       (14528064L, '21648608', 1.9202565460908188e-302),
       (21651072L, '21647712', 1.113579933986867e-305),
       (10374784L, '1918987381', 3.4871913811200906e-304)], 
      dtype=[('Col1', '<u4'), ('Col2', '|S10'), ('Col3', '<f8')])

как программно изменить orig_type to new_type? (не беспокоиться о длине |S10). Есть ли "простой" способ, или мне нужен for-loop для создания нового dtype Constructor объект?

2 ответов


Если ваш вопрос действительно направлен на то, как построить новый dtype объект от старого, это может быть то, что вы ищете:

orig_type = sa.dtype
descr = orig_type.descr
descr[1] = (descr[1][0], "|S10")
new_type = numpy.dtype(descr)

нет ярлыка. Вы бы просто построить новый dtype, как вам нравится и используйте .astype().