Существует ли функция numpy, похожая на np.isin, которая допускает допуск, а не требует, чтобы значения были идентичными?

У меня есть два массива разных размеров, и я хочу определить, где элементы одного массива можно найти в другом массиве. Я хотел бы иметь возможность учитывать допуск между элементами. Цель будет примерно такой:

array1 = [1, 2, 3, 4, 5, 6]
array2 = [2, 8, 1.00001, 1.1]

places = [mystery function](array1, array2, tolerance = 0.001)

возвращение индексов places = [0,1] в array1.

Самое близкое, что я могу получить, это np.isin, который позволяет использовать массивы разных размеров и порядков, но не допуск. (тоже пробовали np.allclose, но здесь проблема с несоответствием формы и порядка). Конечно, это можно сделать с помощью цикла, но мои фактические массивы состоят из тысяч элементов, поэтому цикл нецелесообразен.

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

Заранее спасибо за помощь!

Значит, это несоответствие формы и размеров вас так пугает, что вы даже не можете его детализировать? С этим зависанием вы не сможете избежать циклов numpy. isin избегает этого, поскольку сводит задачу к 1d, в которой затем можно использовать сортировку.

hpaulj 27.09.2023 01:46

Используйте searchsorted, затем сравните разницу

Quang Hoang 27.09.2023 02:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хотя я конкретно не знаю функции в numpy, я только что написал ее.

Надеюсь это поможет:

import numpy as np

def find_indices_within_tolerance(array1, array2, tolerance):
    results = []
    for i, a1_elem in enumerate(array1):
        for a2_elem in array2:
            if abs(a1_elem - a2_elem) <= tolerance:
                results.append(i)
    results = list(set(results))
    results.sort()
    return results

array1 = np.array([1, 2, 3, 4, 5, 6])
array2 = np.array([2, 8, 1.00001, 1.1])

places = find_indices_within_tolerance(array1, array2, tolerance=0.001)

print(places)

-> yields: [0, 1]

Привет! Большое спасибо за ответ! Это очень полезно, но можно ли сделать это без сортировки массива1? В моих данных отсортированный массив1 отличается от несортированного, и важно, чтобы я получил индексы «мест» для несортированного массива.

celery 26.09.2023 20:43

@celery, пожалуйста, проверьте, делает ли это то, что вам нужно сейчас. Этот процесс немного медленнее, так как функционально он представляет собой умножение матриц для сравнения элементов.

birdman 26.09.2023 21:10
Ответ принят как подходящий

С помощью пользовательской функции для поиска абсолютной разницы между двумя массивами и позициями, которые соответствуют заданному допуску:

array1 = np.array([1, 2, 3, 4, 5, 6])
array2 = np.array([2, 8, 1.00001, 1.1])
tolerance = 0.001

def argwhere_close(a, b, tol):
    return np.where(np.any(np.abs(a - b[:, None]) <= tolerance, axis=0))[0]

print(argwhere_close(array1, array2, tolerance))

[0 1]

Другие вопросы по теме