0
def cluster_guess_for_each_obs(self):
    flat_cluster_guess = [self.argmax_list(cp) for cp in self.cluster_possibilities_for_observations()]
    zero_cluster = [0.0 for i in self.clusters]
    all_zero_clusters = [zero_cluster for p in range(len(flat_cluster_guess))]
    for enum in enumerate(flat_cluster_guess):
        all_zero_clusters[enum[0]][enum[1]] = 1.0
    print all_zero_clusters
    self.cluster_assignments = all_zero_cluster 
    return

现在第一行返回一个 0 和 1 的列表,表示每个数据属于哪个集群。我想将它(例如 [0, 1, 0, 0, 1, 1, 1])转换为长度为 2 的数组的数组,如下所示: [[1, 0], [0 , 1], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]]。相反,我得到的是在前几次枚举之后它全是 1。

不知道我做错了什么。

4

3 回答 3

1

好的,如果我理解正确,您只需要实现一个执行此操作的方法并调用它一次:

guess = [0, 1, 0, 0, 1, 1, 1]

def build_array(guess):
    result = []

    for i in range(len(guess)):
        new_result.append([0,0])

    for i in range(len(result)):
        result[i][guess[i]] = 1

    return result

在这里,我选择了一个比“Pythonic”更具可读性的解决方案。但希望这使您需要实现的基本逻辑清晰。

于 2013-04-04T05:16:48.083 回答
1
flat = [0, 1, 0, 0, 1, 1, 1]
cluster = []
for pos in flat:
    n = [0, 0]
    n[pos] = 1
    cluster.append(n)
print cluster
# [[1, 0], [0, 1], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]]
于 2013-04-04T05:17:00.073 回答
1

这条线没有做你认为它做的事情:

all_zero_clusters = [zero_cluster for p in range(len(flat_cluster_guess))]

它重复相同的列表(不是列表的副本-指向相同列表的指针)len(flat_cluster_guess)次。这意味着当您更改列表中的一项时,您会更改所有项目。

相反,将表达式移动[0.0 for i in self.clusters]到列表推导中,如下所示:

all_zero_clusters = [[0.0 for i in self.clusters] for p in range(len(flat_cluster_guess))]

或者

all_zero_clusters = [[0] * len(self.clusters) for p in range(len(flat_cluster_guess))]
于 2013-04-04T05:17:31.163 回答