cod*_*000 4 python numpy python-2.7 structured-array
我有一个起始数组:
[(1, [-112.01268501699997, 40.64249414272372])
(2, [-111.86145708699996, 40.4945008710162])]
Run Code Online (Sandbox Code Playgroud)
其中第一列是int,第二列是带有浮点数的元组.我需要添加一个名为USNG的字符串列.
然后我创建一个结构化的numpy数组:
dtype = numpy.dtype([('USNG', '|S100')])
x = numpy.empty(array.shape, dtype=dtype)
Run Code Online (Sandbox Code Playgroud)
我想将x numpy数组附加到现有数组以添加新列,以便我可以为每一行输出一些信息.当我执行以下操作时:
numpy.append(array, x, axis=1)# I've also tried vstack and hstack
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'TypeError: invalid type promotion'
Run Code Online (Sandbox Code Playgroud)
有关为什么会发生这种情况的任何建议?
谢谢
您必须创建一个包含新字段的新dtype.
例如,这里是a:
In [86]: a
Out[86]:
array([(1, [-112.01268501699997, 40.64249414272372]),
(2, [-111.86145708699996, 40.4945008710162])],
dtype=[('i', '<i8'), ('loc', '<f8', (2,))])
Run Code Online (Sandbox Code Playgroud)
a.dtype.descr是[('i', '<i8'), ('loc', '<f8', (2,))]; 即字段类型列表.我们将通过添加('USNG', 'S100')到该列表的末尾来创建新的dtype :
In [87]: new_dt = np.dtype(a.dtype.descr + [('USNG', 'S100')])
Run Code Online (Sandbox Code Playgroud)
现在创建一个新的结构化数组b.我zeros在这里使用,所以字符串字段将以值开头''.你也可以用empty.然后字符串将包含垃圾,但如果您立即为它们分配值,则无关紧要.
In [88]: b = np.zeros(a.shape, dtype=new_dt)
Run Code Online (Sandbox Code Playgroud)
将现有数据复制a到b:
In [89]: b['i'] = a['i']
In [90]: b['loc'] = a['loc']
Run Code Online (Sandbox Code Playgroud)
下面是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')])
Run Code Online (Sandbox Code Playgroud)
使用一些数据填写新字段:
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')])
Run Code Online (Sandbox Code Playgroud)
您是否尝试过使用 numpy 的recfunctions?
import numpy.lib.recfunctions as rfn
Run Code Online (Sandbox Code Playgroud)
它有一些对于结构化数组非常有用的函数。
对于你的情况,我认为可以通过以下方式完成:
a = rfn.append_fields(a, 'USNG', np.empty(a.shape[0], dtype='|S100'), dtypes='|S100')
Run Code Online (Sandbox Code Playgroud)
在这里测试过并且有效。
正如 GMSL 在评论中提到的。可以使用 rfn.merge_arrays 来做到这一点,如下所示:
a = np.array([(1, [-112.01268501699997, 40.64249414272372]),
(2, [-111.86145708699996, 40.4945008710162])],
dtype=[('i', '<i8'), ('loc', '<f8', (2,))])
a2 = np.full(a.shape[0], '', dtype=[('USNG', '|S100')])
a3 = rfn.merge_arrays((a, a2), flatten=True)
Run Code Online (Sandbox Code Playgroud)
a3 将具有以下值:
array([(1, [-112.01268502, 40.64249414], b''),
(2, [-111.86145709, 40.49450087], b'')],
dtype=[('i', '<i8'), ('loc', '<f8', (2,)), ('USNG', 'S100')])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5103 次 |
| 最近记录: |