首页 > 解决方案 > 将带有值的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 数组中所需的输出。

标签: pythonarraysnumpy

解决方案


这是 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]

推荐阅读