user2520932
user2520932

Reputation: 83

Turn array into array of arrays following structure of another array

I would like to turn an array into an array of arrays following another array of arrays. I'm not sure how to do this, here are the arrays:

orig_array = [[0,1],[4],[3],[],[3,2,6],[]]
my_array = [2,0,1,3,3,4,5]

wanted_array = [[2,0],[1],[3],[],[3,4,5],[]]

I would like to keep the empty arrays.

Thanks

Upvotes: 1

Views: 1205

Answers (4)

hpaulj
hpaulj

Reputation: 231335

In [858]: my_array = [2,0,1,3,3,4,5]

In [859]: [[my_array.pop(0) for _ in range(len(x))] for x in orig_array]
Out[859]: [[2, 0], [1], [3], [], [3, 4, 5], []]

Use b=my_array[:] if you don't want to change my_array.

This operates on the same principle as @karoly's answer; just more direct because it assumes only one level of nesting.

Upvotes: 1

Martin Hallén
Martin Hallén

Reputation: 1552

You could do the following:

import copy

def reflect_array(orig_array, order):
    wanted_array = copy.deepcopy(orig_array)
    for i, part_list in enumerate(orig_array):
        for j, _ in enumerate(part_list):
            wanted_array[i][j] = order.pop()
    return wanted_array

Test run:

orig_array = [[0,1],[4],[3],[],[3,2,6],[]]
my_array = [2,0,1,3,3,4,5]

print reflect_array(orig_array, my_array)
# [[2, 0], [1], [3], [], [3, 4, 5], []]

Upvotes: 1

Divakar
Divakar

Reputation: 221504

Get the lengths of each element in orig_array, perform cumumlative summations along the length values to give us the indices at which my_array needs to be split and finally use np.split to actually perform the splitting. Thus, the implementation would look something like this -

lens = [len(item) for item in orig_array]
out = np.split(my_array,np.cumsum(lens))[:-1]

Sample run -

In [72]: orig_array = np.array([[0,1],[4],[3],[],[3,2,6],[]])
    ...: my_array = np.array([2,0,1,3,3,4,5])
    ...: 

In [73]: lens = [len(item) for item in orig_array]
    ...: out = np.split(my_array,np.cumsum(lens))[:-1]
    ...: 

In [74]: out
Out[74]: 
[array([2, 0]),
 array([1]),
 array([3]),
 array([], dtype=int64),
 array([3, 4, 5]),
 array([], dtype=int64)]

Upvotes: 3

Karoly Horvath
Karoly Horvath

Reputation: 96258

def do(format, values):
    if type(format) == list:
        return [do(v, values) for v in format]
    else:
        return values.pop(0)

print do(orig_array, my_array)

Note: this destroys the array where the values come from.

Upvotes: 2

Related Questions