Получение индексов измененных данных между двумя массивами - PullRequest
1 голос
/ 22 февраля 2011

У меня есть два трехмерных массива a1 и a2, где len(a1) == len(a2) и a1[x, y, z] = id

Я использую этот код, чтобы узнать, изменились ли данные в любом из слоев z

eq = a1 == a2
if eq.any():
    #find the indexes of the changed data

как говорится в комментарии и заголовке, мне нужно найти индексы измененных данных. в основном у меня есть список объектов, которые соответствуют позициям в массиве, и мне нужно обновить эти объекты на основе идентификатора, извлеченного из массива. Я хочу сделать это как можно быстрее, так как этот список может стать ДЕЙСТВИТЕЛЬНО большим, возможно, более 120 000 записей. но только сотня или около того этих записей могут измениться за один раз. поэтому я хотел бы получить список измененных индексов, чтобы я мог вызвать объект с этим индексом и обновить его.

Мне нужно поддерживать три компонента индекса

есть ли способ сделать это, не просматривая список? возможно с numpy.nonzero()

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Еще два варианта:

np.argwhere(a1!=a2)
np.where(a1!=a2)

Они оба делают одно и то же, но дают результаты в разных форматах (один подходит для индексации массивов, другой - более читаемый)

1 голос
/ 22 февраля 2011

Я не понял специфику вашего вопроса (например, размер / форма вашего массива);это решение должно быть достаточно общим, хотя.В любом случае, это без петель:

# two 2d arrays
x = NP.random.randint(0, 10, 20).reshape(5, 4)
y = NP.random.randint(0, 10, 20).reshape(5, 4)

ndx1, ndx2 = NP.nonzero((x - y))

# all indices in which the values of x & y differ, each index is a tuple
ndx = zip(ndx1, ndx2)  

# you can also use argwhere, returns each index as a 1d array vs. tuple:
NP.argwhere(dxy)

# finally, just generating an array the same size as the diff array with e.g.,
# '1' for each diff element and '0' for each non-diff:
dxy = x - y
NP.where(dxy=0, 0, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...