Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Numpy: Joining structured arrays?

Tags:

python

numpy

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 
like image 317
Jon-Eric Avatar asked Mar 18 '11 17:03

Jon-Eric


People also ask

How do I combine multiple NumPy arrays into one?

You can use the numpy. concatenate() function to concat, merge, or join a sequence of two or multiple arrays into a single NumPy array. Concatenation refers to putting the contents of two or more arrays in a single array.


1 Answers

You can also use the function merge_arrays of numpy.lib.recfunctions:

import numpy.lib.recfunctions as rfn rfn.merge_arrays(arrays, flatten = True, usemask = False)  Out[52]:  array([(1, 2, 7, 10.0), (3, 4, 8, 11.0), (5, 6, 9, 12.0)],       dtype=[('x', '<i4'), ('y', '<i4'), ('z', '<i4'), ('w', '<f8')]) 
like image 94
joris Avatar answered Sep 23 '22 06:09

joris