2016-07-23 6 views
0

1次元numpy配列のすべての要素に対して同時に作用する関数を定義できるので、配列をループオーバーする必要はありません。たとえば、配列のすべての要素をループせずに四角形にすることができます。numpy配列のすべての要素に作用する関数?

:出力のようなものであるように

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 

def F(Z): 
    return Z[0] + Z[1] - Z[2] 

print F(A) 

:ようなもので

>>> array([3, -2, 6, 3]) 

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 
B = [] 

for i in A: 
    B.append(i[0] + i[1] - i[2]) 

B = array(B) 
print B 

出力:私は後だものの例では、このコードを交換することです

>>> array([ [3] , [-2], [6], [3] ]) 

私は第2コードwを知っています私が後にしていることを生み出すことはできませんが、私が話していることのアイデアを伝えようとしています。ありがとう!

編集:

私は上記の関数を単純な例として使用しました。

from numpy import linalg as LA 

def F(Z): 
    #Z is an array of matrices 
    return LA.eigh(Z)[0] 

だから私は、3×3行列の配列を持っている、と私は彼らの固有値の出力配列をたい:私が使用したいのですが、実際の機能は次のようなものです。そして、配列をループする必要がないように、いくつかの方法でこれを行うことが可能かどうかは疑問です。

+0

スライスが役立つかもしれない:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing – Divakar

+3

'B = A [:、0] + A [:, 1] - A [:、2] '? (あなたが '[2]'ではなく 'i [2]を意味していると仮定します。)あるいは' np.dot'を使うこともできます:基本的に行列ごとの乗算をここで行います。 –

+1

'numpy'は、既に1つまたは複数の配列のすべての要素に対して機能する基本的な関数セットを定義しています。効率的な 'numpy'コードは、これらの機能を組み合わせています。それには、「並行」なビルディングブロックがたくさんあると考えてください。それらを「シリアル」思考(「スカラー」関数のルーピング)に戻す前に使ってみてください。 – hpaulj

答えて

3

試してみてください。

np.apply_along_axis(F, 1, A) 
+2

この特別なケースでは、 'apply_along_axis'の実装にPythonレベルの' for'ループが含まれているので、これは不必要に非効率的です。 (まあ、実際は、whileループですが、同じことが起こります。)単純なスライシングソリューションが良いかもしれません。 –

+0

はい、それは本当です。私はいくつかのテストを実行しましたが、このソリューションはforループよりも速く動作しません。それは間違いなくコードを書くためのより効率的な方法ですが、ここでの私の目標である計算効率を低下させません。私はスライスが行く方法かもしれないと思います。みんなに感謝します。 – cracka31

関連する問題