n x m
行列X
およびn x p
行列Y
ここで、Y
はバイナリデータです。最後にp x n
行列Z
があります。ここで、Z
の列はX
の列の関数であり、1に対応する列の項目はY
です。バイナリデータを持つ別のサブセットベースの行列
反復が
i=0, j=0: subsetted_column = [[1],[4]]
i=0, j=1: subsetted_column = [[7]]
i=1, j=0: subsetted_column = [[2],[5]]
i=1, j=1: subsetted_column = [[8]]
i=2, j=0: subsetted_column = [[3],[6]]
i=2, j=1: subsetted_column = [[9]]
を生成する
>>> X
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> Y
array([[1, 0],
[1, 0],
[0, 1]])
n_x,m = X.shape
n_y,p = Y.shape
Z = np.zeros([p, n_x])
for i in range(n_x):
col = X[:,[i]]
for j in range(p):
#this is where I subset col with Y[:,[j]]
Z[j][i] = my_func(subsetted_column)
例えば私は、単一のリスト内包しているネストされたループを行うにはいくつかの方法があると仮定します。関数my_func
にも長い時間がかかりますので、何とか並列化するといいでしょう。
編集:私は
for i in range(n_x):
for j in range(p):
subsetted_column = np.trim_zeros(np.multiply(X[:,i], Y[:,j]))
Z[j][i] = my_func(subsetted_column)
しかし、私はまだ簡単に解決
を意味します。この質問で私たちが助けることができるのは、実行時間のごく一部であるループオーバーヘッドを減らすことだけです。 'my_func'が遅い場合、それをnx * p回呼び出すことはループ機構ではなく、ボトルネックになります。 – hpaulj
合意。私の主な質問(および質問のタイトル)は、ループを指しています。 – Sal
多分、関数自体を並列化しないで、関数の複数のインスタンスを並列に実行してみてください。この種のものに対して 'multiprocessing.Pool'を使う方法については、[post](http://stackoverflow.com/questions/19429377/parallel-processing-pool-python)を参照してください。 –