Как проверить наличие данного массива numpy в массиве numpy большей формы? - PullRequest
0 голосов
/ 19 ноября 2018

Полагаю, заголовок моего вопроса может быть не очень понятным ..

У меня есть небольшой массив, скажем a = ([[0,0,0],[0,0,1],[0,1,1]]).Тогда у меня есть больший массив более высокого измерения, скажем, b = ([[[2,2,2],[2,0,1],[2,1,1]],[[0,0,0],[3,3,1],[3,1,1]],[...]]).

. Я хотел бы проверить, можно ли найти один из элементов a в b.В этом случае я бы обнаружил, что первый элемент [0,0,0] действительно находится в b, а затем я бы хотел получить соответствующий индекс в b.

Я бы хотелчтобы сделать это, избегая зацикливания, так как из очень немногого, что я понял из numpy массивов, они не предназначены для итерации классическим способом.Другими словами, мне нужно, чтобы он был очень быстрым, потому что мои настоящие массивы довольно большие.

Есть идеи?Большое спасибо!

Арно.

1 Ответ

0 голосов
/ 19 ноября 2018

Я не знаю прямого пути, но вот функция, которая решает проблему:

import numpy as np

def find_indices(val, arr):
    # first take a mean at the lowest level of each array,
    # then compare these to eliminate the majority of entries
    mb = np.mean(arr, axis=2); ma = np.mean(val)
    Y = np.argwhere(mb==ma)
    indices = []
    # Then run a quick loop on the remaining elements to
    # eliminate arrays that don't match the order
    for i in range(len(Y)):
        idx = (Y[i,0],Y[i,1])
        if np.array_equal(val, arr[idx]):
            indices.append(idx)

    return indices

# Sample arrays
a = np.array([[0,0,0],[0,0,1],[0,1,1]])
b = np.array([ [[6,5,4],[0,0,1],[2,3,3]],   \
               [[2,5,4],[6,5,4],[0,0,0]],   \
               [[2,0,2],[3,5,4],[5,4,6]],   \
               [[6,5,4],[0,0,0],[2,5,3]]  ])



print(find_indices(a[0], b))
# [(1, 2), (3, 1)]
print(find_indices(a[1], b))
# [(0, 1)]

Идея состоит в том, чтобы использовать среднее значение каждого массива и сравнивать его со средним значением входных данных. np.argwhere() здесь ключ. Таким образом вы удаляете большинство нежелательных совпадений, но мне нужно было использовать цикл с остатком, чтобы избежать несортированных совпадений (это не должно быть слишком трудоемким). Возможно, вы захотите настроить его дальше, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...