Python在循环中调用相同的函数,并使用最后一次调用的返回值作为此调用的参数

2024-09-30 08:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我写的kmeans。我想循环调用这个函数,反复计算到中心点的距离,并输入返回值作为参数 第一个输入是(b[0,:],b[1,:])

def DIV(point1,point2):   
    plt.figure()
    c = []
    d = []
    for i in range(1000):
        dist1 = np.linalg.norm(Z[i] - point1)
        dist2 = np.linalg.norm(Z[i] - point2)
        if dist1 > dist2:
            c.append(Z[i])
        else:
            d.append(Z[i])
    C = np.array(c)
    D = np.array(d)
    plt.scatter(C[:,0],C[:,1],s=16.,color='green')
    plt.scatter(D[:,0],D[:,1],s=16.,color='yellow')

    center1 = C.mean(axis=0)
    center2 = D.mean(axis=0)
    plt.scatter(center1[0],center1[1],marker ='x',s=16.,color='red')
    plt.scatter(center2[0],center2[1],marker ='x',s=16.,color='red')
    return center1,center2

Tags: normnppltmeanarraycolorappendlinalg
2条回答

我使用了非常麻烦的循环和函数来控制它的迭代

    def paste(head, start=0, stop=0, step=1, sep=''):
        return [f'{head}{sep}{i}' for i in range(start, stop, step)]
   def loop(n):
        k = paste('a', 0, n)
        k[0],k[1] = DIV(b[0,:],b[1,:])
        for i in range(0,n,2):
            k[i],k[i+1] = DIV(k[i],k[i+1])
            for j in range(2,n,2):            
                k[j],k[j+1] = DIV(k[i],k[i+1])

    loop(6)

你的功能和背景并不重要,听起来你基本上是在根据你对我的评论的反应来做一个“定点”功能:

def fix(func, initial, max_iter):
    prev = func(initial)
    iteration = 1
    while True:
        curr = func(prev)
        if curr == prev or iteration > max_iter:
            break
        prev = curr
        iteration += 1
    return curr

对于您的具体情况,您可以编写

div = lambda (a, b): DIV(a, b)
result = fix(div, (b[0,:],b[1,:]), max_iter=1000)

如果您想使用相同的内联逻辑,而不是使用更通用的逻辑,您可以编写

prev = DIV(b[0,:],b[1,:])
iteration = 1
while True:
    curr = DIV(*prev)
    if curr == prev or iteration > 1000:
        break
    prev = curr
    iteration += 1
result = curr

相关问题 更多 >

    热门问题