2017-05-18 7 views
1
A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
for x in A[1,:]: 
    if x < failure_tolerance: 
     x = 0 

これは明らかに書き込み不能で起こっていることがありますが、私はそれを取り戻すことができません。NumPy配列の行/列をループして値を変更します。

+0

エラーがありますか? –

+0

@ChandaKorat:明らかに、 'A'では何も変わらないので、コードは効果がありません。 –

答えて

2

ここではxのみが変更されています。 xではありません。は配列内の特定のセルを参照し、配列内の要素への参照を保持しますが、要素を保持するセルは保持しません。

は、それでも通常、1つは、あなたが一括に行列に計算を実行したい場合numpyの構造を使用しています。ここでは

A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
A[1,A[1,:] < failure_tolerance] = 0

A[1,:] < failure_tolerancefailure_tolerance未満の値のマスクを構築します。次に、0Aのすべての値に設定します。

failure_tolerance = 5有する)例えば:

>>> failure_tolerance = 5 
>>> A[1,A[1,:] < failure_tolerance] = 0 
>>> A 
array([[1, 2, 3], 
     [0, 5, 6], 
     [7, 8, 0]]) 

それが5よりも小さいので、第二列(4)の最初の要素は今0で置き換えられている見ることができるように。

通常、numpyで呼び出しを実行すると、numpyはPythonでこれらの呼び出しを行いませんが、Cで高性能のデータ構造とアルゴリズムを使用するため、より高速に実行されます。(非常に)小さな行列の場合、 (呼び出しオーバヘッドのためにnumpyが長くかかる可能性がありますが)巨大な行列を扱う場合、numpyはPythonで書かれた解決策よりも明らかに優れています。

さらに、この構文は非常に宣言的です。訓練されていない開発者はすぐにfailure_toleranceより小さい値を設定することを理解します。

EDIT

あなたが複数の条件をしたい場合は、あなたは論理として論理的かと&として|を使用してすることができます。例えば:

A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
A[1,(A[1,:] < failure_tolerance)& (A[1,:] > at_least_value)] = 0

これは、これらの値は、at_least_valuefailure_toleranceの間で所定の0A行のすべての値を設定します。

+0

複数の条件を組み込む方法はありますか?好きなとき:要素がfailure_toleranceより小さく、at_least_valueより大きい場合に要素を変更します –

+1

@JoschKraus:編集を参照してください。 –

+0

A [dst、A [dst、:] -ETA] = 0│20 TypeError:ufunc 'bitwise_and'は入力タイプではサポートされていません。 swap_row(A、swap1、swap2): キャストルール "safe"に基づいて、サポートされているタイプに強制的に強制的に変更されます。 –

関連する問題