Я не знаю прямого пути, но вот функция, которая решает проблему:
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()
здесь ключ. Таким образом вы удаляете большинство нежелательных совпадений, но мне нужно было использовать цикл с остатком, чтобы избежать несортированных совпадений (это не должно быть слишком трудоемким). Возможно, вы захотите настроить его дальше, но я надеюсь, что это поможет.