Link_tester
Link_tester

Reputation: 1081

How to iterate over arrays stored in a list and dictionary

I want to iterate over numpy arrays stored in a list and a dictionray. My list is named as result:

    result= [array([[ 1.        ,  0.75      , 69.5198822 ],
            ...,
            [99.        , 29.25      , 49.51967621]]),
                       ...
     array([[ 1.        ,  0.75      , 78.88569641],
            ...,
            [99.        , 29.25      , 58.88546753]]),
                       ...
     array([[ 1.        ,  0.75      , 77.7075882 ],
            ...,
            [99.        , 29.25      , 57.70734406]])]

My dictionary is also named dicti :

    {'sub_arr1': array([[37.        ,  2.25      ,  2.62501693],
            ...,
            [81.68138123, 29.25      , 99.        ]]),
                          ...
     'sub_arr2': array([[41.        ,  2.25      ,  2.254704  ],
            ...,
            [85.93613434, 29.25      , 99.        ]]),
                          ...
     'sub_arr3': array([[51.        ,  2.25      ,  1.13132851],
            ...,
            [96.60651398, 29.25      , 99.        ]])}

Than, I want to do a calculation between arrays stored in these two data sets (result and dicti). I want to delete some data points of arrays of result that are closer than a threshold (e.g. 10) to arrays of dicti and store them as a new one. In fact, I want to compare the first array of result to the first array of dicti, second with second, third with third and so on. I can say I want to clean arrays stored in result list, then save the new clean arrays as separate ones in a 3d numpy array or a maybe again a list of cleaned arrays. My code (that is not working!!!) is as bellow:

import numpy as np    
new_result=np.array ([])
    for i in result:
        for key, value in dicti():
            clp=result[i][np.where(np.min(distance.cdist(value, result[i]),axis=0)<10)[0],:] # it finds the points of result that are closer 10 to points stored as values of dicti
            cleaned_result= npi.difference(result[i], clp) # it removes that close points
            new_result=np.append (new_result, cleaned_result).

The error I am facing is TypeError: only integer scalar arrays can be converted to a scalar index but I think my code has also other issues. In advance I appreciate any feedback.

Upvotes: 1

Views: 96

Answers (1)

Jorge Morgado
Jorge Morgado

Reputation: 1178

Try something like this:

import numpy as np    
new_result=np.array ([])
for res, value in zip(result, dicti.values()):
    clp=res[np.where(np.min(distance.cdist(value, res),axis=0)<10)[0],:] # it finds the points of result that are closer 10 to points stored as values of dicti
    cleaned_result= npi.difference(res, clp) # it removes that close points
    new_result=np.append (new_result, cleaned_result).

zip is a function that takes two or more iterators and returns in each iteration a tuple where each element is taken from each iterator.

For example:

a = [1,2,3]
b = {'A':'a', 'B':'b', 'C':'c'}
for x, y in zip(a, b.values()):
     print(x, y)

This shows as output:

1 a
2 b
3 c

zip reproduces exactly what you say:

I want to compare the first array of result to the first array of dicti, second with second, third with third and so on

Upvotes: 1

Related Questions