У меня есть 2 numpy массивов: массив 1 имеет элементы 1 ... 100, обозначающие диапазоны для проверки (наименее значимый di git опущен), массив 2 имеет значения 1 ... 1000 для проверки каждого из них диапазоны.
import numpy
o = numpy.array([3, 7, 20, 47, 60, 72, 76, 83, 94, 94])
p = numpy.array([22, 54, 77, 83, 246, 285, 813, 828, 950, 998])
Цель состоит в том, чтобы получить индексы элементов в массиве 2, которые находятся в любом диапазоне массива 1. Например, для 22 нам нужно проверить:
30 < 22 < 40 => false
70 < 22 < 80 => false
etc. (all are false, so index 0 will not be in the result)
и 77 будут истинными, поскольку они лежат в исключительном диапазоне <70;80>
Каков правильный синтаксис?
In [238]: o
Out[238]: array([ 3, 7, 20, 47, 60, 72, 76, 83, 94, 94])
In [239]: p
Out[239]: array([ 22, 54, 77, 83, 246, 285, 813, 828, 950, 998])
In [240]: p[o*10 < p < (o+1)*10 ]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Кажется, это работает, но очень сложно: (абсолютное вычитание с основанием. Верхние значения с сравниваемым значением должны равняться 10)
например, abs (77 -60) + абс (77-70) == 10
In [329]: oo = numpy.vstack(((o*10), (o+1)*10 ) )
In [324]: ten = numpy.abs(numpy.subtract(oo[0,:],p.reshape(-1,1))) + numpy.abs(numpy.subtract(oo[1,:],p.reshape(-1,1)))
array([[ 26, 106, 366, 906, 1166, 1406, 1486, 1626, 1846, 1846],
[ 38, 42, 302, 842, 1102, 1342, 1422, 1562, 1782, 1782],
[ 84, 10, 256, 796, 1056, 1296, 1376, 1516, 1736, 1736],
[ 96, 16, 244, 784, 1044, 1284, 1364, 1504, 1724, 1724],
[ 422, 342, 82, 458, 718, 958, 1038, 1178, 1398, 1398],
[ 500, 420, 160, 380, 640, 880, 960, 1100, 1320, 1320],
[1556, 1476, 1216, 676, 416, 176, 96, 44, 264, 264],
[1586, 1506, 1246, 706, 446, 206, 126, 14, 234, 234],
[1830, 1750, 1490, 950, 690, 450, 370, 230, 10, 10],
[1926, 1846, 1586, 1046, 786, 546, 466, 326, 106, 106]])
In [330]: numpy.where(ten == 10)
Out[330]: (array([2, 8, 8]), array([1, 8, 9]))
In [331]: p[ numpy.where(ten == 10)[0] ]
Out[331]: array([ 77, 950, 950])