Совпадение по последней оси в массиве numpy - PullRequest
0 голосов
/ 18 апреля 2020

Я видел много статей и ответов на другие вопросы о нарезке 3D-списков в python, но я не могу применить эти методы к своему делу.

У меня есть 3D-список:

list = [
    [[0, 56, 78], [4, 86, 90], [7, 87, 34]],
    [[1, 49, 76], [0, 76, 78], [8, 60, 7]], 
    [[9, 6, 58], [6, 57, 78], [10, 46, 2]]
    ]

Последние 2 значения 3-го измерения остаются постоянными, но меняются каждый раз, когда я перезапускаю код. Код должен найти 2 указанные пары c из этих двух последних значений и перейти от одной пары к другой. Так, например:

pair1 = 86, 90
pair2 = 76, 78

Вывод должен быть:

[4, 86, 90], [7, 87, 34], [1, 49, 76], [0, 76, 78]

Я знаю, как найти 2 пары, я просто не уверен, как нарезать список. Заранее спасибо за помощь и оставьте комментарий, если что-то неясно.

1 Ответ

1 голос
/ 18 апреля 2020

Используя numpy, вы можете нарезать массив, чтобы сохранить последние два элемента на последней оси, найти индексы, где происходит каждая пара, сгладить результат и использовать его для нарезки массива:

a = np.array(my_list) # don't call your list "list"

a_sliced = a[...,1:]

ix1 = np.flatnonzero((a_sliced  == pair1).all(-1).ravel()).item()

ix2 = np.flatnonzero((a_sliced  == pair2).all(-1).ravel()).item()

np.concatenate(a)[ix1:ix2+1]

array([[ 4, 86, 90],
       [ 7, 87, 34],
       [ 1, 49, 76],
       [ 0, 76, 78]])

a определяется как массив numpy, а обе пары определены как кортежи:

pair1 = 86, 90
pair2 = 76, 78
...