且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

numpy:如何向现有结构化数组添加一列?

更新时间:2023-12-01 08:25:10

您必须创建一个包含新字段的新 dtype.

You have to create a new dtype that contains the new field.

例如,这里是a:

In [86]: a
Out[86]: 
array([(1, [-112.01268501699997, 40.64249414272372]),
       (2, [-111.86145708699996, 40.4945008710162])], 
      dtype=[('i', '<i8'), ('loc', '<f8', (2,))])

a.dtype.descr[('i', '<i8'), ('loc', '<f8', (2,))]代码>;即字段类型列表.我们将通过将 ('USNG', 'S100') 添加到该列表的末尾来创建一个新的数据类型:

a.dtype.descr is [('i', '<i8'), ('loc', '<f8', (2,))]; i.e. a list of field types. We'll create a new dtype by adding ('USNG', 'S100') to the end of that list:

In [87]: new_dt = np.dtype(a.dtype.descr + [('USNG', 'S100')])

现在创建一个结构化数组,b.我在这里使用了 zeros,因此字符串字段将以 '' 值开头.您也可以使用 empty.字符串随后将包含垃圾,但如果您立即为其赋值,则无关紧要.

Now create a new structured array, b. I used zeros here, so the string fields will start out with the value ''. You could also use empty. The strings will then contain garbage, but that won't matter if you immediately assign values to them.

In [88]: b = np.zeros(a.shape, dtype=new_dt)

将现有数据从a复制到b:

In [89]: b['i'] = a['i']

In [90]: b['loc'] = a['loc']

现在是b:

In [91]: b
Out[91]: 
array([(1, [-112.01268501699997, 40.64249414272372], ''),
       (2, [-111.86145708699996, 40.4945008710162], '')], 
      dtype=[('i', '<i8'), ('loc', '<f8', (2,)), ('USNG', 'S100')])

在新字段中填写一些数据:

Fill in the new field with some data:

In [93]: b['USNG'] = ['FOO', 'BAR']

In [94]: b
Out[94]: 
array([(1, [-112.01268501699997, 40.64249414272372], 'FOO'),
       (2, [-111.86145708699996, 40.4945008710162], 'BAR')], 
      dtype=[('i', '<i8'), ('loc', '<f8', (2,)), ('USNG', 'S100')])