编程语言
首页 > 编程语言> > python – 按两个条件过滤的Numpy数组

python – 按两个条件过滤的Numpy数组

作者:互联网

我正在尝试运行自定义kmeans聚类算法,并且无法按群集获取2-d numpy数组的每列(term)的文档频率.我当前的算法有两个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,cluster-analysis,k-means
来源: https://codeday.me/bug/20190831/1775144.html