将具有值的numpy数组转换为具有每行每个观察的频率的数组

时间:2018-05-28 13:35:23

标签: python arrays numpy

我有一个numpy数组如下:

array = np.random.randint(6, size=(50, 400))

此数组具有每个值所属的集群,每行代表一个样本,每列代表一个特征,但我想创建一个具有每个集群频率的5维数组(在每个样本中,表示为这个矩阵中的一行)。

但是,在频率计算中,我想忽略0,这意味着除0(1-5)之外的所有值的频率都应该加1。

基本上我想要的是一个数组,在这种情况下每行都是一个簇(1-5),每行仍然包含一个样本。

如何做到这一点?

编辑:

小输入:

input = np.random.randint(6, size=(2, 5))

array([[0, 4, 2, 3, 0],
       [5, 5, 2, 5, 3]])

输出:

1    2    3    4    5

0   .33  .33  .33   0
0   .2   .2    0   .6    

其中1-5是行名称,而后两行是numpy数组中的所需输出。

1 个答案:

答案 0 :(得分:4)

这是bincount的简单应用。这样做你想要的吗?

def freqs(x):
    counts = np.bincount(x, minlength=6)[1:]
    return counts/counts.sum()

frequencies = np.apply_along_axis(freqs, axis=1, arr=array)

如果您想知道apply_along_axis的速度影响,那么使用棘手索引的方法在我的测试中速度稍慢:

counts = (array[:, :, None] == values[None, None, :]).sum(axis=1)
frequencies2 = counts/counts.sum(axis=1)[:, None]