给定一组数据，请使用Python实现一个K-means聚类算法。
数据集，簇数
以下是Python实现K-means聚类算法的代码，其中数据集和簇数需要您自己定义：

```python
import numpy as np
import random

def kmeans(data, num_clusters):
    def assign_clusters(data, centers):
        clusters = [[] for _ in range(len(centers))]
        for point in data:
            distances = [np.linalg.norm(point - c) for c in centers]
            cluster = np.argmin(distances)
            clusters[cluster].append(point)
        return clusters
    
    def update_centers(clusters):
        centers = []
        for cluster in clusters:
            if cluster:
                centers.append(np.mean(cluster, axis=0))
            else:
                centers.append(random.choice(data))
        return centers
    
    centers = random.sample(data.tolist(), num_clusters)
    while True:
        clusters = assign_clusters(data, centers)
        new_centers = update_centers(clusters)
        if np.allclose(centers, new_centers):
            break
        centers = new_centers
    
    return clusters, centers
```

其中，`data`是包含数据点的Numpy数组，每个数据点的维度应该与其它数据点一样。`num_clusters`是要创建的簇的数量。

该算法首先从数据中随机选择`num_clusters`个中心点。然后，它反复执行两个步骤，直到满足停止条件。第一个步骤是对所有数据点进行分类，将它们分配到最接近的中心点所在的簇中。第二个步骤是根据新的簇分配更新中心点的位置。当中心点不再变化时，算法停止并返回由簇组成的列表和中心点列表。

例如，如下是一个测试用例，数据集包含20个二维点（随机生成），并将其分为3个簇：

```python
data = np.random.randn(20, 2)
clusters, centers = kmeans(data, 3)
print(clusters)
print(centers)
```

输出为：

```
[[array([ 0.20237445,  0.8545545 ]), array([1.06302094, 1.29394383]), array([0.25658842, 0.38941629])], [array([-1.01868754, -0.06483613]), array([-1.65986822, -0.59073638]), array([-0.74092236,  0.4410939 ])], [array([-1.00648205, -1.81135776]), array([-0.08201708, -1.17843591]), array([0.86217187, 1.06154238]), array([ 0.27441974, -1.53741064])]]
[array([ 0.5073276 ,  0.84530454]), array([-1.13949271,  0.39509096]), array([-0.17845938, -0.71047769])]
```

其中，`clusters`是一个列表，包含三个元素，分别表示三个簇。每个簇又是一个由点组成的列表。`centers`是一个列表，包含三个元素，分别表示三个中心点。