I have the following 3 NumPy arrays:
arr1 = np.array(['a', 'b', 'c', 'd', 'e', 'f']).reshape(2, 3)
arr2 = np.array(['g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']).reshape(2, 5)
arr3 = np.array(['r', 's', 't', 'u']).reshape(2, 2)
I would like to join them column-wise, but have them maintain separation between items coming from each array, like so:
Output:
array([[['a', 'b', 'c'], ['g', 'h', 'i', 'j', 'k'], ['r', 's']],
[['d', 'e', 'f'], ['l', 'm', 'n', 'o', 'p'], ['t', 'u']]], dtype='<U1')
However, I cannot find a NumPy function, which would achieve that for me. The closest I got was just a plain np.concatenate(), but the output does not retain separation I want:
Input: np.concatenate([arr1, arr2, arr3], axis = 1)
Output:
array([['a', 'b', 'c', 'g', 'h', 'i', 'j', 'k', 'r', 's'],
['d', 'e', 'f', 'l', 'm', 'n', 'o', 'p', 't', 'u']], dtype='<U1')
Any suggestions on how I can achieve the desired effect?
UPDATE: Thank you for some great answers. As an added level of difficulty, I would also like the solution to account for a possible variable number of input arrays, which would still share the same number of rows. Therefore, sometimes there would be 3, other times e.g. 6 etc.
You could try:
print(np.array([[x, y, z] for x, y, z in zip(arr1.tolist(), arr2.tolist(), arr3.tolist())]))
Or if you want the inner rows as arrays as well:
print(np.array([np.array([x, y, z]) for x, y, z in zip(arr1.tolist(), arr2.tolist(), arr3.tolist())]))
Output:
[[['a', 'b', 'c'] ['g', 'h', 'i', 'j', 'k'] ['r', 's']]
[['d', 'e', 'f'] ['l', 'm', 'n', 'o', 'p'] ['t', 'u']]]
And the shape is (2, 3)
as expected.
Edit:
As you mentioned in the comment, try:
l = [arr1, arr2, arr3] # list of the arrays:
print(np.array([np.array([x, y, z]) for x, y, z in zip(*[i.tolist() for i in l])]))
This may be a long way to do it, but it works:
arr_all = []
for i in range(arr1.shape[0]):
row = []
row.append([arr[i,:] for arr in [arr1, arr2, arr3]])
arr_all.append(row)
arr_all = np.array(arr_all).reshape(2,3)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With