Check if numpy array is in list of numpy arrays
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_functionfrom numpy import array, array_equal, allclosemyarr0 = 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)) #->Trueprint(is_arr_in_list(myarr0, mylistarr)) #->False#myarr0 is equal to mylistarr[1], but it is not the same object!#test for exact equalitydef 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)) # -> Trueprint(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
.
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.