Показатели среза slice(start, stop[, step])
часто могут быть представлены range(start, stop, step)
(или range(*slice(start, stop, step).indices(length))
при учете основных размеров).Ломтик, представляющий собой конкатенированные срезы
Предположим, что у меня есть даже два многомерных среза, а второй срез можно использовать как срез в результате применения первого среза.
Пример:
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,)
Я хотел бы найти общее выражение для вычисления одного среза, который делает ту же работу. Я знаю размеры базовой структуры данных.
c = data[2, 7, ::-1] # same as b
np.array_equal(b, c) # True
Таким образом, в получении от [::2, 7, :]
и [1, ::-1]
к [2, 7, ::-1]
в этом примере я должен был бы такую функцию:
def concatenate_slices(shape, outer_slice, inner_slice):
...
return combined_slice
где outer_slice
и inner_slice
бы оба кортежа ломтиков. В примере shape=(100, 100, 100)
и outer_slice=(slice(None, None, 2), 7, slice(None, None, None))
и inner_slice=(1, slice(None, None, -1))
.
Я не уверен, как это сделать эффективно.
Мои объекты что-то делают, когда __getitem__(slice)
вызывается (нет промежуточных видов), и я хочу сделать это только один раз, но у вас есть возможность иметь кусочки срезов.
Как расширение (необязательно) Я хотел бы знать, что произойдет, если у меня есть эллипсы в срезах. Как я могу сделать комбинацию?
только для справки: 'range (start, stop, step)' не всегда производит правильные индексы, так как он также может создавать индексы вне диапазона, чтобы создать допустимый диапазон ['slice.indices()'] (https://docs.python.org/3/reference/datamodel.html?highlight=slice.indices#slice.indices): 'range (* slice (start, stop, step) .indices (length)) '. Я не уверен, что можно комбинировать срезы, не принимая во внимание структуру базовой структуры. – mata
@mata Спасибо. Ты прав. Также в моем случае я бы знал форму базовой структуры. Я немного отредактировал. – Trilarion
Я предполагаю, что это можно сделать, если вручную собрать новый кусочек, взглянув на пределы первых двух. Я начал писать, но это слишком грязно для моего вкуса, должен быть лучший способ (поэтому я сдался). –