Как я могу сравнить два массива с разными размерами, но с некоторыми числами, которые являются приблизительными?[Python3] - PullRequest
0 голосов
/ 06 марта 2019

Как я могу сравнить два массива с разными размерами, но с некоторыми числами с плавающей точкой, которые являются приблизительными?Например:

# I have two arrays
a = np.array( [-2.83, -2.54, ..., 0.05, ..., 2.54, 2.83] )
b = np.array( [-3.0, -2.9, -2.8, ..., -0.1, 0.0, 0.1, ..., 2.9, 3.0] )
# wherein len( b ) > len( a )

Мне нужен индекс, где (с учетом этих двух значений из обоих списков)

math.isclose( -2.54, -2.5, rel_tol=1e-1) == True

Мне нужен ответ что-то вроде

list_of_index_of_b = [1, 5, ..., -2]

Здесь list_of_index_of_b - это список с «координатами», где этот конкретный элемент b приближен к некоторому элементу a.Не все элементы a имеют приблизительные значения в b.Также: len(list_of_index_of_b) == len(a)

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете использовать трансляцию.Это создает массив парных различий между каждым элементом в a и b, который вы затем можете проверить по указанному допуску.

Конечно, это вычислительно неэффективно с точки зрения сложности, поскольку вы создаете массив размером |a|*|b| и сравниваете каждое попарное расстояние с допустимым отклонением, даже если одна из разностей уже достаточно мала.Тем не менее, если один из |a| или |b| является относительно небольшим, то этот подход может быть довольно быстрым, поскольку он является чисто тупым и не требует циклов.

a = np.array([1,5,6,7])
b = np.array([1.1,2,3,4.8,4.9,5,8])

rtol = 0.15

diff = a - b[:,None]
mask2d = (1/np.abs(b))*np.abs(a - b[:,None]) < rtol

mask = np.any(mask2d,axis=1)

Это можно комбинировать содна строка:

indices = np.where(np.any((1/np.abs(b))*np.abs(a-b[:,None]) < rtol,axis=1))
...