Jaki byłby najszybszy sposób sprawdzenia, czy wielowymiarowa tablica liczbowa ma 0 ze wszystkich stron.
Dla prostego przykładu 2D mam:
x = np.random.rand(5, 5)
assert np.sum(x[0:, 0]) == 0
assert np.sum(x[0, 0:]) == 0
assert np.sum(x[0:, -1]) == 0
assert np.sum(x[-1, 0:]) == 0
Chociaż jest to w porządku, aby przypadki 2D miały rację, pisanie dla wyższych wymiarów jest nieco nudne i zastanawiałem się, czy jest jakaś sprytna sztuczka numeryczna, której mogę użyć tutaj, aby była wydajna i łatwiejsza w utrzymaniu.
np.all (x[:, 0] == 0)
byłoby bezpieczniej niż suma? Test sumowy jest poprawny tylko wtedy, gdy wszystkie liczby są dodatnie.Odpowiedzi:
Oto jak możesz to zrobić:
np.take
robi to samo, co „fantazyjne” indeksowanie.źródło
numpy.take
robi kopię. Może to spowodować, że będzie gorzej niż kod oparty na widoku. (Konieczne byłobylen(x.shape)
można napisać prościej jakox.ndim
.all
zwarciom. Możesz usunąć nawiasy klamrowe, aby użyć wyrażenia generatora, co pozwalaall
na powrót, gdy tylko jednonumpy.all
połączenie powróciFalse
.Oto odpowiedź, która faktycznie bada części tablicy, którą jesteś zainteresowany i nie marnuje czasu na tworzenie maski wielkości całej tablicy. Istnieje pętla na poziomie Pythona, ale jest krótka, z iteracjami proporcjonalnymi do liczby wymiarów zamiast wielkości tablicy.
źródło
not (view[0] == 0).all()
nie jest to równoważneview[0].any()
?view[0].any()
że też będzie działać. Nie jestem całkowicie pewien wpływu na rzutowanie i buforowanie w obu opcjach -view[0].any()
może teoretycznie zostać wdrożony szybciej, ale wcześniej widziałem dziwne wyniki i nie do końca rozumiem związane z tym buforowanie.view[0].view(bool).any()
, że byłoby to szybkie rozwiązanie.argmax
może faktycznieany
przewyższyć widok logiczny . Te rzeczy stają się dziwne.argmax
lubany
użycie widoku logicznego oznacza obsługę ujemnego zera jako nierównego do zwykłego zera.)Przekształciłem tablicę, a następnie wykonałem iterację. Niestety, moja odpowiedź zakłada, że masz co najmniej trzy wymiary i popełnisz błąd w przypadku normalnych matryc, musisz dodać specjalną klauzulę dla tablic o kształcie 1 i 2 wymiarowym. Ponadto będzie to powolne, więc prawdopodobnie są lepsze rozwiązania.
Który wyprodukuje
Zasadniczo układam wszystkie wymiary jeden na drugim, a następnie przeglądam je, aby sprawdzić ich krawędzie.
źródło
może operator elipsy jest tym, czego szukasz, który będzie działał dla wielu wymiarów:
źródło
Możesz skorzystać z
slice
maskowania logicznego, aby wykonać zadanie:Ta funkcja najpierw kształtuje „rdzeń” tablicy w krotkę
s
, a następnie buduje pokazaną maskęTrue
tylko punkty graniczne. Indeksowanie boolowskie dostarcza punktów granicznych.Przykład roboczy:
Następnie
np.all(borders==0)
poda pożądane informacje.Uwaga: to łamie się dla tablic jednowymiarowych, chociaż uważam je za przypadek krawędzi. Prawdopodobnie lepiej jest po prostu sprawdzić tam dwa punkty, o których mowa
źródło
np.arange(15)
nie obejmuje 15.