【发布时间】:2020-03-31 21:08:29
【问题描述】:
我有 2 个 numpy 数组:数组 1 有元素 1 .. 100 表示要检查的范围(省略了最低有效数字),数组 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) + abs(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])
【问题讨论】:
-
o 包含 94 两次。检查该范围两次有什么意义?