3

複素数空間での多項式の根の収束のカラー マッピングを作成しようとしています。これを行うために、点のグリッドを作成し、これらの点にニュートン法を適用して、それぞれがどの複素根に収束するかを見つけました。これにより、複素数の 2 次元配列が得られます。その要素は、ある程度の許容範囲内で収束するポイントを示します。そのマトリックスの数値を要素ごとのカラー マッピングに一致させたいと考えています。

配列を反復処理し、要素ごとに色を計算することでこれを行いましたが、非常に遅く、ベクトル化することでメリットが得られるようです。これまでの私のコードは次のとおりです。

def colorvec(rootsmatrix, known_roots):
    dim = len(known_roots)
    dist = ndarray((dim, nx, ny))
    for i in range(len(known_roots)):
        dist[i] = abs(rootsmatrix-known_roots[i])

これにより、各ポイントの計算されたルートから実際の各ルートまでの距離を含む 3 次元配列が作成されます。75 000 000 の要素を除いて、このように見えます。

    [ [ [6e-15 7e-15 0.5]
        [1.5 5e-15 0.5]     #submatrix 1
        [0.75 0.98 0.78] ]

      [ [1.5 0.75 0.5]
        [8e-15 5e-15 0.8]     #submatrix 2
        [0.75 0.98 0.78] ]

      [ [1.25 0.5 5e-15]
        [0.5 0.64 4e-15]     #submatrix 3
        [5e-15 4e-15 7e-15] ]

を取りdist、2 次元および 3 次元の引数ごとに 1 次元の引数 (つまり、1、2、または 3) を返します。これdistは最小です。それが私のカラーマッピングになります。たとえば、3 つの部分行列のそれぞれの要素 (0,0) を比較すると、color(0,0) = 0 になります。同様に、color(1,1) = 0 および color (2,2) = 2 です。カラーマトリックス全体に対してこれを実行できるようにしたいと考えています。

を使用してこれを行う方法を見つけることができませんでしたがnumpy.argmin、何かが欠けている可能性があります。これを行う別の方法があれば、特にループを含まない場合は、喜んでお知らせします。ここでは最大 25MP の画像を作成しているため、ループで色を割り当てるのに 25 分かかります。

アドバイスありがとうございます!

4

1 に答える 1

3

axisに引数を渡すことができますargmin。最初の軸(「サブマトリックス」と呼んでいるもの)に沿って最小化したいaxis=0

dist.argmin(0)

dist = array([[[  6.00e-15,   7.00e-15,   5.00e-01],
               [  1.50e+00,   5.00e-15,   5.00e-01],
               [  7.50e-01,   9.80e-01,   7.80e-01]],

              [[  1.50e+00,   7.50e-01,   5.00e-01],
               [  8.00e-15,   5.00e-15,   8.00e-01],
               [  7.50e-01,   9.80e-01,   7.80e-01]],

              [[  1.25e+00,   5.00e-01,   5.00e-15],
               [  5.00e-01,   6.40e-01,   4.00e-15],
               [  5.00e-15,   4.00e-15,   7.00e-15]]])

dist.argmin(0)
#array([[0, 0, 2],
#       [1, 0, 2],
#       [2, 2, 2]])

もちろん、これは0, 1, 2リターンとしてあなたを与えます。あなた1, 2, 3が述べたようにしたい場合は、

dist.argmin(0) + 1
#array([[1, 1, 3],
#       [2, 1, 3],
#       [3, 3, 3]])

最後に、実際に最小値自体が必要な場合 (どの「サブマトリックス」からではなく)、次のように使用できますdist.min(0)

dist.min(0)
#array([[  6.00e-15,   7.00e-15,   5.00e-15],
#       [  8.00e-15,   5.00e-15,   4.00e-15],
#       [  5.00e-15,   4.00e-15,   7.00e-15]])

マトリックスの最小位置を使用してdist別のマトリックスから値を取得する場合は、少し注意が必要ですが、使用できます

minloc = dist.argmin(0)
other[dist.argmin(0), np.arange(dist.shape[1])[:, None], np.arange(dist.shape[2])]

other=distこれが単に呼び出すのと同じ出力を与える場合に注意してくださいdist.min(0)

dist[dist.argmin(0), np.arange(dist.shape[1])[:, None], np.arange(dist.shape[2])]
#array([[  6.00e-15,   7.00e-15,   5.00e-15],
#       [  8.00e-15,   5.00e-15,   4.00e-15],
#       [  5.00e-15,   4.00e-15,   7.00e-15]])

または、otherそれがどの部分行列であるかだけを言うと、同じことが返されます。

other = np.ones((3,3,3))*np.arange(1,4).reshape(3,1,1)

other
#array([[[ 1.,  1.,  1.],
#        [ 1.,  1.,  1.],
#        [ 1.,  1.,  1.]],

#       [[ 2.,  2.,  2.],
#        [ 2.,  2.,  2.],
#        [ 2.,  2.,  2.]],

#       [[ 3.,  3.,  3.],
#        [ 3.,  3.,  3.],
#        [ 3.,  3.,  3.]]])

other[dist.argmin(0), np.arange(dist.shape[1])[:, None], np.arange(dist.shape[2])]
#array([[ 1.,  1.,  3.],
#       [ 2.,  1.,  3.],
#       [ 3.,  3.,  3.]])

無関係なメモとして、isとis colorvecを想定して、そのループなしで書き直すことができますrootsmatrix.shape(nx, ny)known_roots.shape(dim,)

def colorvec(rootsmatrix, known_roots):
    dist = abs(rootsmatrix - known_roots[:, None, None])

whereはとknown_roots[:, None, None]同じknown_roots.reshape(len(known_roots), 1, 1)で、ブロードキャストする原因となりますrootsmatrix

于 2013-11-13T18:41:30.667 に答える