2017-04-05 5 views
1

私は削減、すべてのディメンション全体の動作が、1つの

import numpy 

a = numpy.random.rand(7, 7, 3) < 0.1 

、例えば、複数の次元を持つブールnumpyの配列を持っている私は今、すべての寸法にわたってall操作をしたいと思ったが、最後には、配列を取得しますaは最後の次元で長い場合はサイズ3のこの

all_small = [numpy.all(a[..., k]) for k in range(a.shape[-1])] 

作品が、理由はPythonのループのはとても遅いです。

これをベクトル化する方法に関するヒント?

答えて

3

axis paramを使用できます。だから、最後の1をスキップする3D配列のために、それは次のようになります -

a.all(axis=(0,1)) 

次元の一般的な数のndarraysを処理し、すべての軸に沿ってnumpy.all操作を実行するが、指定され、実装は次のようになります -

In [90]: a = numpy.random.rand(7, 7, 3) < 0.99 

In [91]: a.all(axis=(0,1)) 
Out[91]: array([False, False, True], dtype=bool) 

In [92]: numpy_all_except_one(a) # By default skips last axis 
Out[92]: array([False, False, True], dtype=bool) 

In [93]: a.all(axis=(0,2)) 
Out[93]: array([ True, False, True, True, True, True, True], dtype=bool) 

In [94]: numpy_all_except_one(a, axis=1) 
Out[94]: array([ True, False, True, True, True, True, True], dtype=bool) 

In [95]: a.all(axis=(1,2)) 
Out[95]: array([False, True, True, False, True, True, True], dtype=bool) 

In [96]: numpy_all_except_one(a, axis=0) 
Out[96]: array([False, True, True, False, True, True, True], dtype=bool) 
-

def numpy_all_except_one(a, axis=-1): 
    axes = np.arange(a.ndim) 
    axes = np.delete(axes, axis) 
    return np.all(a, axis=tuple(axes)) 

サンプルは、すべての軸をテストするために実行されます

関連する問題