问题
I have a starting array as such:
[(1, [-112.01268501699997, 40.64249414272372])
(2, [-111.86145708699996, 40.4945008710162])]
where the first column is an int and the second is a tuple with floats in there. I need to add a string column called USNG.
I then create a structured numpy array as such:
dtype = numpy.dtype([('USNG', '|S100')])
x = numpy.empty(array.shape, dtype=dtype)
I want to append the x numpy array to the existing one to add a new column so I can output some information to that column for each row. When I do the following:
numpy.append(array, x, axis=1)# I've also tried vstack and hstack
I get the following error:
'TypeError: invalid type promotion'
Any suggestions on why this is happening?
Thanks
回答1:
You have to create a new dtype that contains the new field.
For example, here's 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 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')])
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)
Copy over the existing data from a to b:
In [89]: b['i'] = a['i']
In [90]: b['loc'] = a['loc']
Here's b now:
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')])
回答2:
The question is precisely: "Any suggestions on why this is happening?"
Fundamentally, this is a bug--- it's been an open ticket at numpy since 2012.
来源:https://stackoverflow.com/questions/25427197/numpy-add-column-to-existing-structured-array