Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine list of numpy arrays and reshape

I'm hoping anybody could help me with the following. I have 2 lists of arrays, which should be linked to each-other. Each list stands for a certain object. arr1 and arr2 are the attributes of that object. For example:

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]

The arrays are linked to each other as in the 1 in arr1, first array belongs to the 20 in arr2 first array. The result I'm looking for in this example would be a numpy array with size 3,4. The 'columns' stand for 0, 1, 2, 3 (the numbers in arr1, plus 0) and the rows are filled with the corresponding values of arr2. When there are no corresponding values this cell should be 0. Example:

array([[ 0, 20, 50, 30],
       [ 0, 50, 50,  0],
       [ 0,  0, 75, 25]])

How would I link these two list of arrays and reshape them in the desired format as shown in the above example?

Many thanks!

like image 348
cf2 Avatar asked Jan 23 '26 20:01

cf2


2 Answers

Here's an almost* vectorized approach -

lens = np.array([len(i) for i in arr1])

N = len(arr1)
row_idx = np.repeat(np.arange(N),lens)
col_idx = np.concatenate(arr1)

M = col_idx.max()+1
out = np.zeros((N,M),dtype=int)
out[row_idx,col_idx] = np.concatenate(arr2)

*: Almost because of the loop comprehension at the start, but that should be computationally negligible as it doesn't involve any computation there.

like image 100
Divakar Avatar answered Jan 25 '26 09:01

Divakar


Here is a solution with for-loops. Showing each step in detail.

import numpy as np

arr1 = [np.array([1, 2, 3]), np.array([1, 2]), np.array([2, 3])]
arr2 = [np.array([20, 50, 30]), np.array([50, 50]), np.array([75, 25])]

maxi = []
for i in range(len(arr1)):
    maxi.append(np.max(arr1[i]))
maxi = np.max(maxi)
output = np.zeros((len(arr2),maxi))
for i in range(len(arr1)):
    for k in range(len(arr1[i])):
        output[i][k]=arr2[i][k]
like image 39
Dschoni Avatar answered Jan 25 '26 10:01

Dschoni



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!