2017-03-17 5 views
1

私は、ピクセルをデータとして使用し、重心の数としてkを使用する画像圧縮のためのk手段を実装しようとしてきました。私は間違いを続けています:IndexError: invalid index to scalar variable.; if assignment[i] == j:の比較ステートメントに記載されています。最初の重心を最初に計算し、それを使ってデータ点を正しい重心に集めることにしました。次に、割り当て変数を使用してセントロイドをargminに再計算します。K-画像圧縮におけるnumpyエラーを意味する

マイコード:

def mykmeans(pixels, K): 
    k=int(K) 
    #number of pixels dimension 
    pixel_num=pixels.shape[0] 
    print('Pixel num',pixel_num) 
    pixel_rand1=np.random.randint(pixel_num,size=(1,k)) 
    int_cent=pixels[pixel_rand1[0],:] #new centroids 
    #for initial centroids 
    dis_temp1=np.array((pixel_num,k)) 
    assignment= [None]*pixel_num 
    for i in range(pixel_num): 
     for j in range(k): 
      dis_temp1[j]=linalg.norm(pixels[i]-int_cent[j])**2 
    assignment=np.argmin(dis_temp1) 
    print('Assignemnt',int(assignment)) 
    x_new=int_cent 
    new_assign=np.array([]) 
    for i in range(pixel_num): 
     for j in range(k): 
      if assignment[i] is j: 
       new_assign += assignment[i] 
    #for after initial centroid 
    while (linalg.norm(x_new-x_old) <1e-4): 
     #part 1 
     for i in range(pixel_num): 
      for j in range(k): 
       dis_temp[j]=linalg.norm(pixels[i]-x_old[j])**2 
     assignment[i]=np.argmin(dis_temp) 
     #   
     #  #part 2 
     new_assign=[] 
     for i in range(pixel_num): 
      for j in range(k): 
       if assignment[i] == j: 
        new_assign += assignment[i] 
      x_new[j]=np.mean(new_assign,axis=0) 
      centroid=x_new 

    print(assignment) 
    print(centroid) 
    return assignment, centroid 

答えて

0

エラーがassignmentがスカラー変数であることを語っています。

したがって、インデックスでassignmentにアクセスすることはできません。したがって、assignment[i] = jはエラーを表示します。

assignmentがここに設定されますassignment=np.argmin(dis_temp1)ここで、dist_temp1は1次元配列です。あなたはnp.argminに1次元配列を渡すと

はそれがスカラーを返します:ドキュメントhereを参照してください。

最初にassignment= [None]*pixel_numを設定したので、変数を再割り当てするように注意する必要があります。

以下はおそらく、あなたはこれが動く

for i in range(pixel_num): 
    for j in range(k): 
     dis_temp1[i][j]=linalg.norm(pixels[i]-int_cent[j])**2 
    assignment[i]=np.argmin(dis_temp1) 

としてdis_temp1 = np.zeros((pixel_num,k))とループを定義することを意味k>2

for i in range(pixel_num): 
    for j in range(k): 
     dis_temp1[j]=linalg.norm(pixels[i]-int_cent[j])**2 

ため、エラーが生成されますようあなたはまた、あなたがdis_tempを定義する方法を見てみなければならない

x_oldが定義されていない新しいエラーに転送します。