Сравнение двух массивов numpy друг с другом

У меня есть два массива numpy одинакового размера (они бывают 48x365), где каждый элемент равен -1, 0 или 1. Я хочу сравнить их и посмотреть, сколько раз они одинаковы и сколько раз они разные при этом игнорируются все случаи, когда хотя бы один из массивов имеет ноль как отсутствие данных. Например:

for x in range(48):
    for y in range(365):
        if array1[x][y] != 0:
            if array2[x][y] != 0:
                if array1[x][y] == array2[x][y]:
                    score = score + 1
                else:
                    score = score - 1
return score

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


person Double AA    schedule 14.07.2011    source источник


Ответы (3)


Просто не повторяйте. Итерация по массиву numpy противоречит цели использования инструмента.

ans = np.logical_and(
    np.logical_and(array1 != 0, array2 != 0),
    array1 == array2 )

должен дать правильное решение.

person Paul    schedule 14.07.2011
comment
Хорошая идея! Но это дает мне логический массив. Мне все еще нужно суммировать все True, чтобы получить оценку. Есть ли numpy-thonic способ сделать это? - person Double AA; 14.07.2011
comment
вы также можете использовать np.sum(array1[ans]) или np.sum(array2[ans]), если вам нужна сумма сама по себе. каждый раз, когда у вас есть false в качестве записи, это значение не будет учитываться. - person ahelm; 14.07.2011

Для меня самый простой способ сделать это:

A = numpy.array()
B = numpy.array()

T = A - B
max = numpy.max(numpy.abs(T))

epsilon = 1e-6
if max > epsilon:
    raise Exception("Not matching arrays")

Это позволяет быстро узнать, совпадают ли массивы, и позволяет сравнивать значения с плавающей запятой !!

person ykatchou    schedule 14.07.2011
comment
Немного более общее решение, чем просил ОП, но действительно очень полезное! - person petr; 31.08.2012

Простые расчеты по следующим направлениям помогут вам выбрать наиболее подходящий способ ведения вашего дела:

In []: A, B= randint(-1, 2, size= (48, 365)), randint(-1, 2, size= (48, 365))
In []: ignore= (0== A)| (0== B)
In []: valid= ~ignore

In []: (A[valid]== B[valid]).sum()
Out[]: 3841
In []: (A[valid]!= B[valid]).sum()
Out[]: 3849
In []: ignore.sum()
Out[]: 9830

Убедитесь, что расчеты верны:

In []: 3841+ 3849+ 9830== 48* 365
Out[]: True

Поэтому ваш score (с этими случайными значениями) будет:

In []: a, b= A[valid], B[valid]
In []: score= (a== b).sum()- (a!= b).sum()
In []: score
Out[]: -8
person eat    schedule 14.07.2011