NumPy:以编程方式修改结构化数组的dtype

6 投票
2 回答
2293 浏览
提问于 2025-04-16 17:05

我有一个结构化的数组,比如:

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 修改成 new_type 呢?(不用担心长度 |S10)。有没有什么“简单”的方法,还是说我需要用一个循环来构建一个新的 dtype 对象呢?

2 个回答

5

没有捷径可走。你只需要按照自己的方式构建新的数据类型,然后使用 .astype() 方法就可以了。

4

如果你的问题是想知道如何从旧的 dtype 对象构建一个新的 dtype 对象,那么这可能正是你需要的内容:

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

撰写回答