1

I have an array my_array containing some tuple data.

I have another array my_array_values of same length containing some integer values.

For each unique value of my_array_values, I want to retrieve a list of values from my_array, that are in the same index as this value in my_array_values. Here is my code and the expected behavior :

my_array = np.array([('AA','11'),('BB','22'),('CC','33'),('DD','44'),('EE','55'),('FF','66')])
my_array_values = np.array([1,2,3,1,3,2])
my_array_values_unique = np.array([1,2,3])

for v in my_array_values_unique:
    print(np.take(my_array, np.where(my_array_values == v)))

Expected behavior :

[('AA', '11'), ('DD', '44')]
[('BB', '22'), ('FF', '66')]
[('CC', '33'), ('EE', '55')]

But actually, my code gives me the following output:

[['AA' '22']]
[['11' '33']]
[['BB' 'CC']]

Can someone explain to me how I can get the correct output?

1
  • 3
    Is there a particular reason you are using numpy rather than standard Python lists? Commented Feb 28, 2020 at 14:04

3 Answers 3

2

You don't need to use take or where at all. Equality check on an array returns a boolean array which is a valid indexing array:

for v in my_array_values_unique:
    print(my_array[my_array_values == v])

And this prints:

[['AA' '11']
 ['DD' '44']]
[['BB' '22']
 ['FF' '66']]
[['CC' '33']
 ['EE' '55']]

If numpy is not specificly required, this can be easily done using lists as well:

lst = [('AA', '11'), ('BB', '22'), ('CC', '33'), ('DD', '44'), ('EE', '55'), ('FF', '66')]
idxs = [1, 2, 3, 1, 3, 2]

for v in set(idxs):
    print([tup for idx, tup in zip(idxs, lst) if idx == v])

Gives:

[('AA', '11'), ('DD', '44')]
[('BB', '22'), ('FF', '66')]
[('CC', '33'), ('EE', '55')]

Another, more efficient, way would be to use defaultdict in order to loop the list once, instead of once for every unique value:

import collections

mapping = collections.defaultdict(list)
for tup, idx in zip(lst, idxs):
    mapping[idx].append(tup)

for lst in mapping.values():
    print(lst)
  • gives the same result as before
Sign up to request clarification or add additional context in comments.

Comments

2

Please use axis=0 when using np.take in this case. By default, it flattens out your array that's why you are getting 'AA' and '22' for case '1'.

Comments

0

I am not sure but, If you are using NumPy array, it will return a list of an array within an array, so you won't get any tuple from it, until and unless you manipulate it again

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.