【问题标题】:K-means numpy error in image compressionK-means 图像压缩中的 numpy 错误
【发布时间】:2017-08-09 10:23:50
【问题描述】:

我一直在尝试使用像素作为数据和 k 作为质心数来实现图像压缩的 k 手段。我不断收到错误消息:IndexError: invalid index to scalar variable.;在if assignment[i] == j: 的比较语句中。我决定先计算初始质心,然后用它来将数据点聚集到正确的质心。然后使用赋值变量重新计算质心到 argmin。

我的代码:

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

【问题讨论】:

    标签: python numpy image-processing k-means


    【解决方案1】:

    错误告诉您assignment 是一个标量变量。

    因此,您不能通过索引访问assignment,因此assignment[i] = j 会给您错误。

    assignment 在此处设置assignment=np.argmin(dis_temp1),其中dist_temp1 是一维数组。

    当您将一维数组传递给np.argmin 时,它会返回一个标量:请参阅文档here

    最初您设置assignment= [None]*pixel_num,因此您需要小心重新分配变量。

    你还应该看看你是如何定义dis_temp的,因为下面会产生k&gt;2的错误

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

    也许您打算将dis_temp1 = np.zeros((pixel_num,k)) 和循环定义为

    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)
    

    这会将代码前移至未定义x_old 的新错误。

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 2012-06-19
      • 2016-11-26
      • 2021-07-09
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多