如何从numpy的数组中选择两个边界之间的点?

时间:2019-03-19 17:23:32

标签: python python-3.x numpy

给出形状为(n,d)的数组A。 n是点(或向量)的数量,d是每个点的维数。

我要从A中选择两个向量的最小值和最大值之间的点。最小和最大尺寸为d。每个维度的最小值和最大值都有最小值和最大值。

A=array([[ 4,  3, 12,  7],
   [ 3,  2, 10,  5],
   [ 6, 10, 14,  8],
   [ 7, 11, 13, 14],
   [10, 16, 20, 14],
   [12, 19, 22, 16],
   [ 7, 10, 25, 18]])
mins = np.array( [5,9,12,6])
maxes = np.array( [10,17,20,15] )

预期结果是:

[ 6, 10, 14,  8],

[ 7, 11, 13, 14],

[10, 16, 20, 14]

1 个答案:

答案 0 :(得分:1)

您可以通过以下行对其进行过滤:

x = np.logical_and((A >= mins).sum(axis=1) == len(mins), (A <= maxes).sum(axis=1) == len(mins))
result = A[x]

result

array([[ 6, 10, 14,  8],
       [ 7, 11, 13, 14],
       [10, 16, 20, 14]])

编辑:以上内容可以简化为:

A[(A <= maxes).sum(axis=1) & (A >= mins).sum(axis=1) == len(mins)]

深入说明:

(A >= mins).sum(axis=1) == len(mins)

返回一个布尔数组,其中所有True都是索引,其中A[index]中的每个数组元素都大于或等于mins数组中的每个元素:

array([False, False,  True,  True,  True,  True,  True], dtype=bool)

我们将其与(A <= maxes).sum(axis=1) == len(mins)结合在一起,maxes表示所有小于x的元素,array([False, False, True, True, True, False, False], dtype=bool) 出来就是

A

我们只需要将其应用于{{1}}