Indeksy plasterka slice(start, stop[, step])
mogą być często reprezentowane przez range(start, stop, step)
(lub range(*slice(start, stop, step).indices(length))
podczas uwzględniania wymiarów podrzędnych).Kromka przedstawiająca połączone plasterki
Załóżmy, że mam nawet dwa wielowymiarowe plasterki, a drugi plaster może zostać użyty jako plaster w wyniku zastosowania pierwszego plasterka.
Przykład:
import numpy as np
data = np.random.rand(*(100, 100, 100))
a = data[::2, 7, :] # slice 1, a.shape = (50,100)
b = a[1, ::-1] # slice 2, b.shape = (100,)
chciałbym znaleźć ogólne wyrażenie obliczania pojedynczy plasterek, który wykonuje tę samą pracę. Znam wymiary podstawowej struktury danych.
c = data[2, 7, ::-1] # same as b
np.array_equal(b, c) # True
Więc w uzyskaniu od [::2, 7, :]
i [1, ::-1]
do [2, 7, ::-1]
w tym przykładzie będę potrzebował funkcji takich jak:
def concatenate_slices(shape, outer_slice, inner_slice):
...
return combined_slice
gdzie outer_slice
i inner_slice
będzie zarówno być krotką plasterki. W przykładzie shape=(100, 100, 100)
i outer_slice=(slice(None, None, 2), 7, slice(None, None, None))
i inner_slice=(1, slice(None, None, -1))
.
Nie jestem pewien, jak to zrobić skutecznie.
Moje obiekty robią coś, gdy jest wywoływana __getitem__(slice)
(brak pośrednich widoków) i chcę to zrobić tylko raz, ale nadal mam możliwość posiadania plasterków plasterków.
Jako rozszerzenie (opcjonalnie) chciałbym wiedzieć, co się stanie, jeśli mam elipsy w plasterkach. Jak mogę utworzyć kombinację?
tylko dla odniesienia: 'zasięg (start, stop, step)' nie zawsze generuje poprawne indeksy, ponieważ może również generować indeksy poza zakresem, aby utworzyć poprawny zakres ['slice.indices()'] (https://docs.python.org/3/reference/datamodel.html?highlight=slice.indices#slice.indices) musi być użyty: 'range (* slice (start, stop, step) .indices (length)) '. Nie jestem pewien, czy możliwe jest łączenie plasterków bez uwzględnienia kształtu podstawowej struktury. – mata
@mata Dzięki. Masz rację. Również w moim przypadku znałbym kształt podstawowej struktury. Edytowałem trochę. – Trilarion
Sądzę, że można to zrobić ręcznie nakładając nowy plaster, patrząc na ograniczenia dwóch pierwszych. Zacząłem to pisać, ale jest zbyt brudny jak na mój gust, powinien być lepszy sposób (więc zrezygnowałem). –