Сравнение двух массивов 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.

Ответ 1

Симпы не повторяются. Итерация по массиву numpy поражает цель использования инструмента.

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

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

Ответ 2

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

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")

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

Ответ 3

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

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

Ответ 4

import numpy as np

A = np.array()
B = np.array()
...
Z = np.array()

to_test = np.array([A, B, .., Z])

# compare linewise if all lines are equal 
np.all(map(lambda x: np.all(x==to_test[0,:]), to_test[1:,:]))