2016-09-21 18 views
1

私はPythonの新機能です。配列をループするのではなく、Pythonの配列操作に慣れようとしています。以下は、私がやっている操作をループのようなものの一例であるが、ループに依存しない、適切な純粋な配列操作をうまくすることができません:要するに同じ配列の複数のインデックスを使用した配列操作

import numpy as np 

def f(arg1, arg2): 
    # an arbitrary function 


def myFunction(a1DNumpyArray): 
    A = a1DNumpyArray  

    # Create a square array with each dimension the size of the argument array. 
    B = np.zeros((A.size, A.size)) 

    # Function f is a function of two elements of the 1D array. For each 
    # element, i, I want to perform the function on it and every element 
    # before it, and store the result in the square array, multiplied by 
    # the difference between the ith and (i-1)th element. 
    for i in range(A.size): 
    B[i,:i] = f(A[i], A[:i])*(A[i]-A[i-1]) 

    # Sum through j and return full sums as 1D array. 
    return np.sum(B, axis=0) 

、私は2つを取る機能を統合しています引数と同じ配列の要素を返し、積分の結果の配列を返します。

ループを使用せずにこれを行うコンパクトな方法はありますか?

+0

これは比較的簡単に読むことができます。あなたがそれを妥協する理由は何ですか? – erip

+0

私はベテランPythoneerによって「配列を操作するためにループを使用せず、配列操作を使用する」と言われています。明らかにこれが読みやすさをあまりにも妥協するならば、私はループに固執するでしょう。 –

+1

私は、より良いルールは、 "配列を操作するためにループを使用しないで、必要な操作を行う配列操作が存在する"と言います。 – Kevin

答えて

0

任意のf関数とこの[i, :i]ビジネスを使用すると、ループを渡すと複雑になります。

高速コンパイルされたnumpyオペレーションの大半は、配列全体または行全体および/または列全体で機能し、効果的に並行して動作します。本質的にシーケンシャルなループ(1つのループの値は前のループの値に依存する)はうまく収まらない。また、各ループのサイズリストや配列が異なると、「ベクトル化」が難しくなるという良い指標となります。 (arg1*arg2ような単純な)サンプルAと既知f

for i in range(A.size): 
    B[i,:i] = f(A[i], A[:i])*(A[i]-A[i-1]) 

、私はB配列を生成し、全体としてBを扱うパターンを見てね。一見すると、Bは下三角です。索引作成に役立つ機能があります。しかし、その最終的な合計は、画像を変更する可能性があります。

時には、ボトムアップアプローチでこれらの問題に取り組んで、内部ループを先に取り除こうとしています。しかし、この場合、ある種の大きな画像アプローチが必要だと私は考えています。

関連する問題