2017-01-12 9 views
2

が階層/ネストされたスライスのいくつかの並べ替えを行うにはnumpythonic /より多くの神託の方法があり、これをきれいにバージョンすなわち:Pythonの:階層スライス

_sum = 0 
for i in np.arange(n): 
    _sum += someFunc(A[i,:]) 

を基本的に私はsomeFuncをマッピングしたい(配列をとりますどの形状のものであっても数値を返す)を計算し、結果を合計します。

私はnp.sum(someFunc(A[:,:]))について考えていましたが、私の理解によれば、これは配列全体にsomeFuncをマップするだけです。

+1

'sum(np.apply_along_axis(someFunc、1、A))'ベクトル化されたオプションではありませんか? – Divakar

+0

'someFunc'とは何でしょうか? – MSeifert

+0

この場合、1行あたりの等しい値の数がカウントされています...しかし、私はかなりの数のインスタンスでこの問題に遭遇しました。 – Faser

答えて

2

私が正しく理解している場合は、次のようにリストの内包表記を使用することができます。

sum([someFunc(A[i:]) for i in np.arange(n)]) 
1

は、配列内の1の数をカウントする機能を定義します。

def foo(x): 
    return (x==1).sum() 

と2D配列:

In [431]: X=np.array([[1,0,2],[3,1,1],[0,2,3]]) 

行に繰り返し適用できます。

In [432]: [foo(i) for i in X] # iterate on 1st dimension 
Out[432]: [1, 2, 0] 
In [433]: [foo(X[i,:]) for i in range(3)] 
Out[433]: [1, 2, 0] 

と(ここではPythonの合計)sumとの合計数を取得

In [434]: sum([foo(X[i,:]) for i in range(3)]) 
Out[434]: 3 

書かれたようfooは、配列全体

In [435]: foo(X) 
Out[435]: 3 

と行数のために適用されると同じことを取得しますnp.sum軸コントロールを使用してください:

In [440]: np.sum(X==1, axis=1) 
Out[440]: array([1, 2, 0]) 

apply_along_axis行の繰り返しの同じ種類にすることができます

In [438]: np.apply_along_axis(foo,1,X) 
Out[438]: array([1, 2, 0]) 

が、これのために、それはやり過ぎです。これは、nth以外のすべてのディメンションに対して反復処理を行うのが難しい3Dまたはそれ以上の配列の方が便利です。独自の繰り返しを行うよりも決して高速ではありません。

配列全体を処理する関数を書くことができるのは明らかです。しかし、行を反復する必要がある場合、魔法の解決策はありません。 vectorizeおよびfrompyfuncラップ関数は1次元配列ではなくスカラー値で動作します。一部のrow問題は、行をより大きなdtypeオブジェクト(たとえば、unique行)にキャストすることで解決されます。