所以让我们说我们有一个2D NumPy数组(表示坐标),我想检查所有坐标是否都在一定范围内。最Python化的方法是什么?例如:
absolute
a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
#ALL THE COORDINATES WITHIN x-> 0 to 4 AND y-> 0 to 4 SHOULD
BE PUT IN b (x and y ranges might not be equal)
b = #DO SOME OPERATION
答案 0 :(得分:2)
如果两个方向(x和y)的范围相同,则将它们进行比较并使用all
:
import numpy as np
a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
a[(a >= 0).all(axis=1) & (a <= 4).all(axis=1)]
# array([[3, 4],
# [0, 0]])
如果范围不相同,您还可以比较与该轴大小相同的可迭代对象(这里有两个):
mins = 0, 1 # x_min, y_min
maxs = 4, 10 # x_max, y_max
a[(a >= mins).all(axis=1) & (a <= maxs).all(axis=1)]
# array([[1, 5],
# [3, 4]])
要查看此处发生的情况,让我们看一下中间步骤:
比较给出了每个元素的比较结果,形状与原始数组相同:
a >= mins
# array([[False, True],
# [ True, True],
# [ True, True],
# [ True, True],
# [ True, True],
# [ True, False],
# [False, False]], dtype=bool)
使用nmpy.ndarray.all
,您可以了解所有值是否为真,类似于内置函数all
:
(a >= mins).all()
# False
使用axis
参数,可以将其限制为仅沿数组的一个(或多个)轴比较值:
(a >= mins).all(axis=1)
# array([False, True, True, True, True, False, False], dtype=bool)
(a >= mins).all(axis=0)
# array([False, False], dtype=bool)
请注意,此输出与数组具有相同的形状,不同之处在于,用axis
提及的所有尺寸都被压缩为单个True
/ False
。
在使用True, False
值序列对数组进行索引时,如果可能的话,将其转换为正确的形状。由于我们用(7, 2)
索引对形状为(7,) = (7, 1)
的数组进行索引,因此这些值沿第二维隐式重复,因此这些值用于选择原始数组的行。