我有一个numpy数组形状(2,N)和三个约束来过滤。
这是我尝试过的:
xmax, ymax = 7, 8
dst = np.linspace(-2,10,20).reshape((2,-1)).astype(np.int32)
mask = np.where((0 <= dst) & (dst[1,:] < xmax) & (dst[0,:] < ymax))
mask = np.vstack(mask).T
for p in mask:
print(p, dst[:,p[1]])
哪个产生
(array([[-2, -1, 0, 0, 0, 1, 1, 2, 3, 3],
[ 4, 4, 5, 6, 6, 7, 8, 8, 9, 10]]), (2L, 10L))
(array([0, 2]), array([0, 5]))
(array([0, 3]), array([0, 6]))
(array([0, 4]), array([0, 6]))
(array([1, 0]), array([-2, 4])) #<-- Why do I get this ??
(array([1, 1]), array([-1, 4])) #<-- Why do I get this ??
(array([1, 2]), array([0, 5]))
(array([1, 3]), array([0, 6]))
(array([1, 4]), array([0, 6]))
我做错了什么产生了这两个不需要的结果(-2,4)和(-1,4)?
答案 0 :(得分:0)
如@hpaulj所述,错误在于where子句。我没有意识到我可以把它当作一个连续的布尔数组。我学到的是,如果我保持dst&gt; = 0检查,我保持我的维度,然后我可以添加两个约束来检查每行值明确小于零。
xmax, ymax = 7, 8
dst = np.linspace(-2,10,20).reshape((2,-1)).astype(np.int32)
mask = np.argwhere((dst >= 0) & (dst[0,:] >= 0) & (dst[1,:] >= 0) & (dst[1,:] < xmax) & (dst[0,:] < ymax))
print(mask)
for p in mask:
print(p, dst[:,p[1]])
答案 1 :(得分:0)
In [5]: xmax, ymax = 7, 8
...: dst = np.linspace(-2,10,20).reshape((2,-1)).astype(np.int32)
...: mask = np.where((0 <= dst) & (dst[1,:] < xmax) & (dst[0,:] < ymax))
...:
In [6]: mask
Out[6]:
(array([0, 0, 0, 1, 1, 1, 1, 1], dtype=int32),
array([2, 3, 4, 0, 1, 2, 3, 4], dtype=int32))
In [8]: dst[mask]
Out[8]: array([0, 0, 0, 4, 4, 5, 6, 6])
mask
会选择dst
的正确元素,但要从任一行中选择。
但是这只使用mask
信息的一部分从两行中选择。所以它有一些masked
值,但也有另一行的值。
In [9]: dst[:,mask[1]]
Out[9]:
array([[ 0, 0, 0, -2, -1, 0, 0, 0],
[ 5, 6, 6, 4, 4, 5, 6, 6]])
In [10]: dst[0,mask[1]]
Out[10]: array([ 0, 0, 0, -2, -1, 0, 0, 0])
In [11]: dst[1,mask[1]]
Out[11]: array([5, 6, 6, 4, 4, 5, 6, 6])