numpy 2d每行都有约束

时间:2018-02-16 05:18:04

标签: python numpy

我有一个numpy数组形状(2,N)和三个约束来过滤。

  1. 列中的值不得为负数
  2. 第0行必须小于常数,例如xmax
  3. 第1行必须小于常数,例如ymax
  4. 这是我尝试过的:

    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)?

2 个答案:

答案 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])