Numpy.allclose - определяет допуск на основе процента сходства двоичных значений - PullRequest
1 голос
/ 08 октября 2019

Этот сценарий определяет, идентичны ли два числовых массива arr1 и arr2. Массивы будут содержать только значения 1 или 0 и будут иметь одинаковый размер.

Массивы всегда будут иметь 4 столбца, но может быть переменное количество строк, поэтому возможные размеры массива будут 4x4,4x5, 4x6 и т. Д. (Но помните, что все сравниваемые массивы будут одинакового размера).

Я хотел бы определить min_similarity_percent и рассчитать «допуск» на основе этого процента, а также массиваразмер. Я не понимаю, должен ли я использовать аргументы atol или rtol в моем случае. https://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html

Например, если min_similarity_percent == 90 и между arr1 и arr2, когда они оба 4x4, есть только один другой элемент, я бы хотел, чтобы np.allclose () возвратил Trueпотому что (15/16) * 100 == 93,75, что> 90.

Как рассчитать значение допуска atol или rtol, чтобы соответствовать этому?

import numpy as np

arr1 = np.array([
    [0,0,1,1],
    [0,0,1,1],
    [1,0,1,1],
    [0,0,1,0]
])

arr2 = np.array([
    [1,0,1,1],
    [0,0,1,1],
    [1,0,1,1],
    [0,0,1,0]
])

min_similarity_percent = 90
similar = np.allclose(arr1, arr2)

if similar:
    print("similar")
else:
    print("not similar")

1 Ответ

2 голосов
/ 08 октября 2019

Как указано в комментариях, процедуры сравнения массивов поэлементно . Если вы хотите сравнить весь массив, вам нужно указать numpy, как вы собираетесь вычислять «метрику» между двумя массивами. Предполагая, что вы используете среднее значение, просто выполните:

tol = 90 / 100
(arr1 == arr2).mean() >= tol

Метод .mean по умолчанию суммирует логические значения как 0s и 1s и возвращает число с плавающей запятой.

...