私はPythonでいくつかのコードを書きましたが、うまく動作しますが非常に遅いです。私はforループのためだと思います。 numpyコマンドを使用して以下の操作を高速化できることを願っています。私は目標を定義しましょう。ループの代わりにnumpyのベクトル化
次元数がrow
x col
の2D numpy配列があるとします。例えば、6
x 11
アレイ(下記の図を参照)を考えてみましょう。配列が得られ
私はすべての行の平均値を計算したい、すなわち合計ⱼaᵢⱼ。これはもちろん簡単に行うことができます。 各行ため、私はそれらの合計を計算し、すべての列の数で割って、いくつかの選択された値、特定の閾値以下、すなわち、すべての値の平均を計算する、今
(私はこの値
CM_tilde
を呼び出します) (N
)。値がこの定義済みのしきい値を超える場合は、CM_tilde
の値(行全体の平均)が加算されます。この値は、その後CM
呼ばれ、
CM
値は、これに加えて、行
内の各要素から減算され、私はすべてのそれらのCM
の値が記載されているnumpyの配列またはリストが欲しいです。
フィギュア:
次のコードが機能していますが、非常に遅い(配列が大きい取得する場合は特に)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros((data.shape[0], data.shape[1], data.shape[2]))
all_CMs = np.zeros((data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
任意のアイデア?
は、あなたは、本質的に置き換え値を含めて、行全体にわたり平均値を算出し、その後* * CM_tildeによってtresholdの上にある任意の値を交換し、できますか? – Evert
まず内側のforループを置換するために 'np.where'を使い始めます。次に、ブロードキャストを使用して、外側の2つのループを削除できます。 [where](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html)のドキュメントを参照してください – mtadd