2

私は Numpy が初めてなので、C++ で書いた特定のコードを実装する際に問題に直面しています。

for(i=0;i<h;i++)
{
    for(j=0;j<w;j++)
    {
        val=0;
        for(i1=-size;i1<=size;i1++)
        {
            for(j1=-size;j1<=size;j1++)
            {
                h1=i+i1,w1=j+j1;
                if (w1<=0) w1=w1+w;
                if (h1<=0) h1=h1+h;
                if (w1>=w) w1=w1-w;
                if (h1>=h) h1=h1-h;
                val=val+sqrt(pow(data[i][j][0]-data[h1][w1][0],2)
                            +pow(data[i][j][1]-data[h1][w1][1],2)
                            +pow(data[i][j][2]-data[h1][w1][2],2));
            }
        }
    }
}

ご覧のとおり、基本的に [i,j] 要素のユークリッド距離を、部分行列 [i-size から i+size][j-size から j+size] の一部であるすべての要素に追加しています。

行と列の位置に依存する numpy 配列の各要素に対して何らかの操作を実行するためにループを使用することなく、python でコードを記述するにはどうすればよいですか。または、それを最適化する何らかの方法が必要です。

これは、非常に遅いような私の現在の実装です

for i in range(0,h):
    for j in range(0,w):
        for i1 in range(-window_size, window_size+1):
            for j1 in range(-window_size, window_size+1):
                h1=i+i1
                w1=j+j1
                if w1 <= 0:
                    w1+=w
                if  h1 <= 0:
                    h1+=h
                if w1 >= w:
                    w1-=w
                if h1 >= h:
                    h1-=h
                val[i][j] += np.sqrt(((source_pyr_down_3_Luv[i][j][0] - source_pyr_down_3_Luv[h1][w1][0])**2)
                                    +((source_pyr_down_3_Luv[i][j][1] - source_pyr_down_3_Luv[h1][w1][1])**2)
                                    +((source_pyr_down_3_Luv[i][j][2] - source_pyr_down_3_Luv[h1][w1][2])**2))

このコードを実行するのに約 6 分かかりました。

4

2 に答える 2

3

サブアレイim numpy tryにアクセスするには:

data[i-size:i+size,j-size:j+size]

この部分配列を編集するには (この場合、単純に各要素に +1 を追加します):

data[i-size:i+size,j-size:j+size] += 1

または、(形状 (n,2) の) 2 つの配列の要素間の距離を含む別の配列を取得するには:

data3 = np.sqrt(np.power(data1[:,0]-data2[:,0],2)+ np.power(data1[:,1]-data2[:,1],2))

これが完全な答えではないことはわかっていますが、始めるのに役立つことを願っています.

于 2012-12-26T22:30:29.143 に答える
2

元の行列を事前に拡張することで、明示的な内部ループを回避し、ユークリッド距離の行列を直接計算して、要素インデックスのチェックが不要になるようにすることができます。

# Extend the matrix to avoid modular access
h, w, _ = data.shape
exdata = numpy.zeros((h+2*size, w+2*size, 2), data.dtype)
exdata[size:-size, size:-size, :] = data[:,:,:]  # Fill central part
exdata[:size,:,:] = exdata[-size*2:-size,:,:]    # Copy last rows to begin
exdata[-size:,:,:] = exdata[size:size*2,:,:]     # Copy first rows to end
exdata[:,:size,:] = exdata[:,-size*2:-size,:]    # Copy last cols to begin
exdata[:,-size:,:] = exdata[:,size:size*2,:]     # Copy first cols to end

# Do the actual computation
val = 0
for i in xrange(h):
    for j in xrange(w):
        dx = numpy.copy(exdata[i:i+size*2+1, j:j+size*2+1, 0])  # all x values
        dy = numpy.copy(exdata[i:i+size*2+1, j:j+size*2+1, 1])  # all y values
        dx -= dx[size, size] # subtract central x
        dy -= dy[size, size] # subtract central y
        dx *= dx # square dx
        dy *= dy # square dy
        dx += dy # sum of squares
        val += numpy.sum(dx ** 0.5)
于 2012-12-26T22:58:50.683 に答える