代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

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

  •  1
  • Jack Arnestad  · 技术社区  · 8 年前

    我有一个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 回复  |  直到 8 年前
        1
  •  4
  •   chthonicdaemon    8 年前

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