danym Ubuntu niesamowite wyjaśnienie, można użyć reduce
aby rozwiązać problem, ale trzeba zastosować go do bitwise_and
i bitwise_or
zamiast equal
. W konsekwencji, to nie będzie działać z pływającymi tablic punkcie:
In [60]: np.bitwise_and.reduce(a) == a[0]
Out[60]: array([ True, False, True], dtype=bool)
In [61]: np.bitwise_and.reduce(b) == b[0]
Out[61]: array([ True, False, True], dtype=bool)
zasadzie porównywania bity każdego elementu w kolumnie. Identyczne bity pozostają niezmienione. Różne bity są ustawione na zero. W ten sposób każda liczba, która ma zero zamiast jednego bitu, zmieni zredukowaną wartość. bitwise_and
nie będzie pułapką, w przypadku gdy wprowadzone są bity zamiast usunięte:
In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])
In [63]: c
Out[63]:
array([[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True, True, True], dtype=bool)
Drugi coumn jest oczywiście błędne.Musimy wykorzystać bitwise_or
pułapkę nowych bitów:
In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False, True], dtype=bool)
ostateczna odpowiedź
In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False, True], dtype=bool)
In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False, True], dtype=boo
In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False, True], dtype=bool)
Metoda ta jest bardziej restrykcyjna i mniej elegancki niż sugestia ubunut za korzystania all
, ale ma tę zaletę, że nie tworzenie ogromnych tymczasowych tablic, jeśli twoje wejście jest ogromne. Tymczasowe tablice powinny być tak duże, jak pierwszy rząd macierzy.
EDIT
podstawie tej Q/A i the bug I filed with numpy, rozwiązanie pod warunkiem, działa tylko dlatego, że tablica zawiera zer i jedynek. Tak się składa, że przedstawione operacje bitwise_and.reduce()
mogą tylko zwracać zero lub jeden, ponieważ bitwise_and.identity
jest niezamierzony, a nie 012486. Utrzymuję tę odpowiedź w nadziei, że numpy
zostanie naprawiony, a odpowiedź stanie się prawidłowa.
Edit
Wygląda na to, że będzie w rzeczywistości zmiana NumPy wkrótce. Z pewnością do bitwise_and.identity
, a także ewentualnie opcjonalny parametr do zmniejszenia.
Edit
Dobra wiadomość dla wszystkich. Identyfikator dla np.bitwise_and
został ustawiony na -1
od wersji 1.12.0
.
Ten problem przez pewien czas mnie dręczył. Podczas gdy rozwiązanie @ Ubuntu jest wystarczająco eleganckie, nie jest zbyt przyjemne próbować uruchomić to na podwójnej tablicy 4096 ** 3 tylko po to, aby uzyskać tablicę typu boolean, która śledzi dowolną pamięć, którą zostawiłeś. Bawiłem się z czystą implementacją Pythona używając 'np.equal (a, a [:, 0, None])', ale to kończy się z tym samym problemem. W związku z tym pracuję nad PR dla numpy, aby dodać nową funkcję 'np.same' do obsługi dokładnie tego rodzaju sytuacji. –