def decompose_atom_list(atom_list):
transpose = list(zip(*atom_list))<EOL>if len(transpose) == <NUM_LIT:4>:<EOL><INDENT>elements = np.array(transpose[<NUM_LIT:0>])<EOL>array_a = np.array(transpose[<NUM_LIT:1>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_b = np.array(transpose[<NUM_LIT:2>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_c = np.array(transpose[<NUM_LIT:3>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_ab = np.concatenate((array_a, array_b), axis=<NUM_LIT:1>)<EOL>coordinates = np.concatenate((array_ab, array_c), axis=<NUM_LIT:1>)<EOL>return elements, coordinates<EOL><DEDENT>elif len(transpose) == <NUM_LIT:5>:<EOL><INDENT>elements = np.array(transpose[<NUM_LIT:0>])<EOL>atom_ids = np.array(transpose[<NUM_LIT:1>])<EOL>array_a = np.array(transpose[<NUM_LIT:2>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_b = np.array(transpose[<NUM_LIT:3>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_c = np.array(transpose[<NUM_LIT:4>]).reshape(-<NUM_LIT:1>, <NUM_LIT:1>)<EOL>array_ab = np.concatenate((array_a, array_b), axis=<NUM_LIT:1>)<EOL>coordinates = np.concatenate((array_ab, array_c), axis=<NUM_LIT:1>)<EOL>return elements, atom_ids, coordinates<EOL><DEDENT>else:<EOL><INDENT>raise _FunctionError(<EOL>"<STR_LIT>"<EOL>"<STR_LIT>")<EOL><DEDENT>
Return elements and/or atom ids and coordinates from an `atom list`.

Depending on input type of an atom list (version 1 or 2)

    1. [[element, coordinates (x, y, z)], ...]
    2. [[element, atom key, coordinates (x, y, z)], ...]

the function reverses what pywindow.utilities.compose_atom_list() do.

Parameters
----------
atom_list : list
    A nested list of lists (version 1 or 2)

Returns
-------
touple
    A touple of elements and coordinates arrays, or if input contained
    atom ideas, also atom ids array.