fsperrle
fsperrle

Reputation: 1302

Check if numpy array is in list of numpy arrays

I have a list of numpy arrays and a single numpy array. I want to check if that single array is a member of the list.

I suppose there exist a method and I haven't searched properly... This is what I came up with:

def inList(array, list):
    for element in list:
        if np.array_equal(element, array):
            return True
    return False

Is this implementation correct? Is there any ready function for this?

Upvotes: 39

Views: 34138

Answers (3)

fabi lauchi
fabi lauchi

Reputation: 161

There is a much simpler way without the need to loop using np.all(). It only works when all the arrays within the list of arrays have the same shape:

list_np_arrays = np.array([[1., 1.], [1., 2.]])
array_to_check = np.array([1., 2.])

is_in_list = np.any(np.all(array_to_check == list_np_arrays, axis=1))

The variable is_in_list indicates if there is any array within he list of numpy arrays which is equal to the array to check.

Upvotes: 16

gg349
gg349

Reputation: 22671

Using the verb is when talking about python is a bit ambiguous. This example covers all the cases I could think of:

from __future__ import print_function
from numpy import array, array_equal, allclose

myarr0 = array([1, 0])
myarr1 = array([3.4499999, 3.2])
mylistarr = [array([1, 2, 3]), array([1, 0]), array([3.45, 3.2])]

#test for identity:
def is_arr_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if elem is myarr), False)

print(is_arr_in_list(mylistarr[2], mylistarr)) #->True
print(is_arr_in_list(myarr0, mylistarr)) #->False
#myarr0 is equal to mylistarr[1], but it is not the same object!

#test for exact equality
def arreq_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if array_equal(elem, myarr)), False)

print(arreq_in_list(myarr0, mylistarr)) # -> True
print(arreq_in_list(myarr1, mylistarr)) # -> False

#test for approximate equality (for floating point types)
def arreqclose_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if elem.size == myarr.size and allclose(elem, myarr)), False)

print(arreqclose_in_list(myarr1, mylistarr)) #-> True

PS:do NOT use list for a variable name, as it is a reserved keyword, and often leads to subtle errors. Similarly, do not use array.

Upvotes: 13

Moj
Moj

Reputation: 6363

lets say you have an array like this:

a= [array([ 1, 24,  4, 5]), array([ 22,   4, 123]), array([11,  1,  1])]
#convert all subarrays to list
a= [ list(item) for item in a ]

no you can check for a sublist like this:

In [80]: [1,22,4] in a
Out[80]: False

In [81]: [1,24,4,5] in a
Out[81]: True

Upvotes: 7

Related Questions