python - Numpy 数组按两个条件过滤

标签 python numpy cluster-analysis k-means

我正在尝试运行自定义 kmeans 聚类算法,但无法按聚类获取二维 numpy 数组的每一列(项)的文档频率。我当前的算法有两个 numpy 数组,一个按术语 [2000L,9500L] 列出文档的原始数据集,另一个是聚类分配 [2000L,]。有5个集群。我需要做的是创建一个数组,列出每个集群的文档频率——基本上是每列中的一个计数,其中列号与不同数组中的行号匹配。输出将是一个 [5L, 9500L] 数组(簇 x 项)。我无法找到一种方法来执行相当于 countif 和 group by 的操作。下面是一些示例数据和我想要的输出,如果我只用 2 个集群运行它:

import numpy as np

dataset = np.array[[1,2,0,3,0],[0,2,0,0,3],[4,5,2,3,0],[0,0,2,3,0]]
clusters = np.array[0,1,1,0]
#run code here to get documentFrequency
print documentFrequency
>> [1,1,1,2,0],[1,2,1,1,1]

我的想法是选择出与每个集群匹配的特定行,因为这样计数应该很容易。例如,如果我可以将数据拆分为以下数组:

cluster0 = np.array[[1,2,0,3,0],[0,0,2,3,0]]
cluster1 = np.array[[0,2,0,0,3],[4,5,2,3,0]]

任何方向或指示将不胜感激!

最佳答案

我不认为有任何简单的方法来向量化您的代码,但如果您只有几个集群,您可以做显而易见的事情:

>>> cluster_count = np.max(clusters)+1
>>> doc_freq = np.zeros((cluster_count, dataset.shape[1]), dtype=dataset.dtype)
>>> for j in xrange(cluster_count):
...     doc_freq[j] = np.sum(dataset[clusters == j], axis=0)
... 
>>> doc_freq
array([[1, 2, 2, 6, 0],
       [4, 7, 2, 3, 3]])

关于python - Numpy 数组按两个条件过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19846250/

相关文章:

python - 将函数映射到子列表python的一部分

python - 我可以使用 k-means 对不完整的图进行聚类吗?

python - 从 Gtk3 应用程序中的 VteTerminal 读取 Python 文本缓冲区中的文本

带有 Chrome 的 Python Selenium。如何在不同的选项卡之间切换

调用函数时用 **kwargs 内存的 Python 似乎不起作用

opencv - 集群和kmeans的文档不清晰

python - 如何在核密度估计中找到局部最大值?

python - Kaggle 笔记本无法读取数据集

python - 移动曲线的底部而不改变两端

python - numpy.dot 速度很慢,但安装了 blas 和 lapack,如何解决?