Pytanie Sprawdź, czy numpy array znajduje się na liście numpy tablic


Mam listę numpy array i pojedynczą tablicę numpy. Chcę sprawdzić, czy ta pojedyncza tablica jest członkiem listy.

Przypuszczam, że istnieje metoda i nie przeszukaliśmy prawidłowo ... Oto, co wymyśliłem:

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

Czy ta implementacja jest poprawna? Czy jest w tym jakaś gotowa funkcja?


11
2018-06-01 10:58


pochodzenie


czy możesz podać przykład? - Moj
"Czy ta implementacja jest poprawna?" Cóż, mam cię przetestowałem to?! - jonrsharpe
Najwyraźniej używasz lista z ndarrays, ponieważ mogą mieć różne długości lub typy danych? W przeciwnym razie przekonwertowałbyś swoją listę do tablicy. A co masz na myśli, mówiąc, że jedna tablica jest członkiem listy? Czy to musi być identyczny lub musi to być równy do macierzy, z którą testujesz? - eickenberg
Tylko w celach informacyjnych, odpowiedź na podobne pytanie jest tutaj stackoverflow.com/questions/5488307/numpy-array-in-python-list - wingr


Odpowiedzi:


Korzystanie z czasownika is kiedy mówienie o pythonie jest nieco niejednoznaczne. Ten przykład obejmuje wszystkie przypadki, o których mogłem pomyśleć:

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: NIE używaj list dla nazwy zmiennej, ponieważ jest zastrzeżonym słowem kluczowym i często prowadzi do subtelnych błędów. Podobnie, nie używaj array.


6
2018-06-01 11:49





powiedzmy, że masz tablicę taką jak ta:

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 ]

nie, możesz sprawdzić podlistę w ten sposób:

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

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

3
2018-06-01 11:16



Zakładasz, że wszystkie tablice mają ten sam kształt, co nie wynika z pytania. Następnie przekształcasz całą listę w tablicę. A potem, żeby sprawdzić, ty przerób wszystko z powrotem do listy list? To może przy odrobinie szczęścia działać na potrzeby PO, ale nie wydaje się, aby było to jak najbardziej optymalne. - eickenberg
@eickenberg masz rację co do optymalnego rozwiązania. jest to w zasadzie powiedział, że ma listę numpy tablicy i do korzystania z tego rozwiązania wszystkie tablice powinny być konwertowane do listy. więc mógłbym albo przetworzyć listę zagnieżdżoną i przekonwertować lub użyć powyższego rozwiązania. o tej samej długości macie rację. Aktualizuję moje rozwiązanie - Moj