Сравнение двух массивов друг с другом - PullRequest
10 голосов
/ 14 июля 2011

У меня есть два одинаковых по размеру массива (они размером 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 там.

Ответы [ 4 ]

12 голосов
/ 14 июля 2011

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

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

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

6 голосов
/ 15 июля 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")

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

0 голосов
/ 11 сентября 2013
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:,:]))
0 голосов
/ 14 июля 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...