I have an array `X`

and a list `A1`

. I want to create a new list `B1`

such that it consists of values from `X`

corresponding to indices in `A1`

. For example, the code should pick values from `X[0]`

for indices in `A1[0]`

and so on…I present the current and expected outputs.

import numpy as np X= np.array([[417.551036, 0.0, 0.0, 353.856161, 0.0, 282.754301, 0.0, 0.0, 134.119055, 63.4573886, 208.344718, 1e-24], [417.551036, 0.0, 332.821605, 294.983702, 0.0, 278.809292, 126.991664, 0.0, 136.02651, 83.1512525, 207.329562, 1e-24]]) A1=[[[3, 4, 6]], [[1, 3, 6]]] for i in range(0,len(A1)): for j in range(0,len(X)): B1 = [[X[j][i] for i in indices] for indices in A1[i]] print(B1)

The current output is

[[294.983702, 0.0, 126.991664]] [[0.0, 294.983702, 126.991664]]

The expected output is

[[353.856161, 0.0, 0.0]] [[0.0, 294.983702, 126.991664]]

## Advertisement

## Answer

For the `i`

th element of `A1`

, you want to pick elements from the `i`

th row of `X`

, so iterate over `A1`

and `X`

simultaneously using `zip`

. In the loop, `ai`

is a list containing a single list. This inner list contains the indices you want.

result = [] for xi, ai in zip(X, A1): indices = ai[0] result.append(xi[indices].tolist())

Which gives the desired `result`

:

[[353.856161, 0.0, 0.0], [0.0, 294.983702, 126.991664]]

Note that I converted `xi[indices]`

to a list, but if the result you want is a numpy array then you don’t need to do that, and instead just:

result = np.array([xi[ai[0]] for xi, ai in zip(X, A1)])

which gives a `2x3`

`result`

array:

array([[353.856161, 0. , 0. ], [ 0. , 294.983702, 126.991664]])