[Numpy-discussion] Numpy array in iterable

Kim Hansen slaunger@gmail....
Thu Mar 5 06:18:23 CST 2009


Hi again

It turned out not to be quite good enough as is, as it requires unique
values for both arrays. Whereas this is often true for the second
argument, it is never true for the first argument in my use case, and
I struggled with that for some time until i realized I could use
unique1d with the rever_index optional parameter set True

def ismember(totest, members)
        """
        A setmember1d, which works for totest arrays with duplicate values
        """
        uniques_in_test, rev_idx = unique1d(totest, return_inverse=True)
        uniques_in_members_mask = setmember1d(uniques_in_test, members)
        # Use this instead is members is not unique
        # uniques_in_members_mask = setmember1d(uniques_in_test,
unique1d(members))
        return uniques_in_members_mask[rev_idx]

I saw someone else providing an alternative implementation of this,
which was longer and included a loop. I do not know which is the most
efficient one, but I understand this one better.

-- Slaunger

2009/2/25  <josef.pktd@gmail.com>:
> On Wed, Feb 25, 2009 at 7:28 AM, Kim Hansen <slaunger@gmail.com> wrote:
>> Hi Numpy discussions
>> Quite often I find myself wanting to generate a boolean mask for fancy
>> slicing of some array, where the mask itself is generated by checking
>> if its value has one of several relevant values (corresponding to
>> states)
>> So at the the element level thsi corresponds to checking if
>> element in iterable
>> But I can't use the in operator on a numpy array:
>>
>> In [1]: test = arange(5)
>> In [2]: states = [0, 2]
>> In [3]: mask = test in states
>> ---------------------------------------------------------------------------
>> ValueError                                Traceback (most recent call last)
>> C:\Documents and Settings\kha\<ipython console> in <module>()
>> ValueError: The truth value of an array with more than one element is ambiguous.
>> Use a.any() or a.all()
>>
>> I can however make my own utility function which works effectively the
>> same way by iterating through the states
>>
>> In [4]: for i, state in enumerate(states):
>>   ...:     if i == 0:
>>   ...:         result = test == state
>>   ...:     else:
>>   ...:         result |= test == state
>>   ...:
>>   ...:
>> In [5]: result
>> Out[5]: array([ True, False,  True, False, False], dtype=bool)
>>
>> However, I would have thought such an "array.is_in()" utility function
>> was already available in the numpy package?
>>
>> But I can't find it, and I am curious to hear if it is there or if it
>> just available in another form which I have simply overlooked.
>>
>> If it is not there I think it could be a nice extra utility funtion
>> for the ndarray object.
>>
>> --Slaunger
>> _______________________________________________
>> Numpy-discussion mailing list
>> Numpy-discussion@scipy.org
>> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>>
>
> does this help:
>
>>>> np.setmember1d(test,states)
> array([ True, False,  True, False, False], dtype=bool)
>
> Josef
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>


More information about the Numpy-discussion mailing list