Numpy: Joining structured arrays?
numpy, python
Solution
Here is an implementation that should be faster. It converts everything to arrays of `numpy.uint8` and does not use any temporaries.
def join_struct_arrays(arrays):
sizes = numpy.array([a.itemsize for a in arrays])
offsets = numpy.r_[0, sizes.cumsum()]
n = len(arrays[0])
joint = numpy.empty((n, offsets[-1]), dtype=numpy.uint8)
for a, size, offset in zip(arrays, sizes, offsets):
joint[:,offset:offset+size] = a.view(numpy.uint8).reshape(n,size)
dtype = sum((a.dtype.descr for a in arrays), [])
return joint.ravel().view(dtype)
Edit: Simplified the code and avoided the unnecessary `as_strided()`.
Problem
Input I have many numpy structured arrays in a list like this example: ``` import numpy a1 = numpy.array([(1, 2), (3, 4), (5, 6)], dtype=[('x', int), ('y', int)]) a2 = numpy.array([(7,10), (8,11), (9,12)], dtype=[('z', int), ('w', float)]) arrays = [a1, a2] ``` Desired Output What is the correct way to join them all together to create a unified structured array like the following? ``` desired_result = numpy.array([(1, 2, 7, 10), (3, 4, 8, 11), (5, 6, 9, 12)], dtype=[('x', int), ('y', int), ('z', int), ('w', float)]) ``` Current Approach This is what I'm currently using, but it is very slow, so I suspect there must be a more efficent way. ``` from numpy.lib.recfunctions import append_fields def join_struct_arrays(arrays): for array in arrays: try: result = append_fields(result, array.dtype.names, [array[name] for name in array.dtype.names], usemask=False) except NameError: result = array return result ```