2016-09-12 153 views
2

我有以下數組shape(5,2,3),它是2 * 3數組的集合。在Numpy陣列數組明智比較

a = array([[[ 0, 2, 0], 
    [ 3, 1, 1]], 

    [[ 1, 1, 0], 
    [ 2, 2, 1]], 

    [[ 0, 1, 0], 
    [ 3, 2, 1]], 

    [[-1, 2, 0], 
    [ 4, 1, 1]], 

    [[ 1, 0, 0], 
    [ 2, 3, 1]]]) 

1)如何檢查,如果存在這個陣列陣列,其中至少一個元件處於它負在一個2 * 3數組?

#which is this: 
[[-1, 2, 0], 
[ 4, 1, 1]] 

2)之後如何可以除去上述發現2 * 3陣列從a

矢量化的實現非常讚賞,但循環也很好。

回答

2

你可以這樣做 -

a[~(a<0).any(axis=(1,2))] 

或者與.all()等同,從而避免了inverting -

a[(a>=0).all(axis=(1,2))] 

採樣運行 -

In [35]: a 
Out[35]: 
array([[[ 0, 2, 0], 
     [ 3, 1, 1]], 

     [[ 1, 1, 0], 
     [ 2, 2, 1]], 

     [[ 0, 1, 0], 
     [ 3, 2, 1]], 

     [[-1, 2, 0], 
     [ 4, 1, 1]], 

     [[ 1, 0, 0], 
     [ 2, 3, 1]]]) 

In [36]: a[~(a<0).any(axis=(1,2))] 
Out[36]: 
array([[[0, 2, 0], 
     [3, 1, 1]], 

     [[1, 1, 0], 
     [2, 2, 1]], 

     [[0, 1, 0], 
     [3, 2, 1]], 

     [[1, 0, 0], 
     [2, 3, 1]]]) 
2

使用any

In [10]: np.any(a<0,axis=-1) 
Out[10]: 
array([[False, False], 
     [False, False], 
     [False, False], 
     [ True, False], 
     [False, False]], dtype=bool) 

或多個完整的,如果你想爲(2,3)數組對應的索引:

In [22]: np.where(np.any(a<0,axis=-1).any(axis=-1)) 
Out[22]: (array([3]),) 
# Or as mentioned in comment you can pass a tuple to `any` np.where(np.any(a<0,axis=(1, 2))) 

您也可以用一個簡單的索引數組:

In [27]: a[np.any(a<0, axis=(1, 2))] 
Out[27]: 
array([[[-1, 2, 0], 
     [ 4, 1, 1]]]) 
+0

你也可以傳遞一個元組到np.any:'np.any(a <0,axis =(1,2))' – ayhan

+0

@ayhan事實上,好點! – Kasramvd