numpy Stacking 1D arrays into structured array
You want to use np.column_stack
:
import numpy as np
x = np.random.randint(10,size=3)
y = np.random.randint(10,size=3)
z = np.random.randint(10,size=3)
w = np.column_stack((x, y, z))
w = w.ravel().view([('x', x.dtype), ('y', y.dtype), ('z', z.dtype)])
>>> w
array([(5, 1, 8), (8, 4, 9), (4, 2, 6)],
dtype=[('x', '<i4'), ('y', '<i4'), ('z', '<i4')])
>>> x
array([5, 8, 4])
>>> y
array([1, 4, 2])
>>> z
array([8, 9, 6])
>>> w['x']
array([5, 8, 4])
>>> w['y']
array([1, 4, 2])
>>> w['z']
array([8, 9, 6])
One way to go is
wtype=np.dtype([('x',x.dtype),('y',y.dtype),('z',z.dtype)])
w=np.empty(len(x),dtype=wtype)
w['x']=x
w['y']=y
w['z']=z
Notice that the size of each number returned by randint depends on your platform, so instead of an int32, i.e. 'i4', on my machine I have an int64 which is 'i8'. This other way is more portable.
To build on top of the chosen answer, you can make this process dynamic:
- You first loop over your arrays (which can be single columns)
- Then you loop over your columns to get the datatypes
- You create the empty array using those datatypes
- Then we repeat those loops to populate the array
SETUP
# First, let's build a structured array
rows = [
("A", 1),
("B", 2),
("C", 3),
]
dtype = [
("letter", str, 1),
("number", int, 1),
]
arr = np.array(rows, dtype=dtype)
# Then, let's create a standalone column, of the same length:
rows = [
1.0,
2.0,
3.0,
]
dtype = [
("float", float, 1)
]
new_col = np.array(rows, dtype=dtype)
SOLVING THE PROBLEM
# Now, we dynamically create an empty array with the dtypes from our structured array and our new column:
dtypes = []
for array in [arr, new_col]:
for name in array.dtype.names:
dtype = (name, array[name].dtype)
dtypes.append(dtype)
new_arr = np.empty(len(new_col), dtype=dtypes)
# Finally, put your data in the empty array:
for array in [arr, new_col]:
for name in array.dtype.names:
new_arr[name] = array[name]
Hope it helps