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

Python 将具有值的numpy数组转换为具有每行中每个观测值频率的数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组,如下所示: array = np.random.randint(6, size=(50, 400)) 该数组具有每个值所属的簇,每行表示一个样本,每列表示一个特征,但我想创建一个5维数组,每个样本中每个簇的频率表示为该矩阵中的一行 但是,在频率计算中,我希望忽略0,这意味着除0 1-5之外的所有值的频率都应加上1 本质上,我想要的是一个数组,在本例中,每一行都是集群1-5,并且每一行仍然包含一个样本 如何做到这一点 编辑: 小投入: input = np.random.

我有一个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数组中所需的输出。

这是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)
如果您想知道沿_轴应用_的速度含义,在我的测试中,这种使用复杂索引的方法稍微慢一些:

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

这是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)
如果您想知道沿_轴应用_的速度含义,在我的测试中,这种使用复杂索引的方法稍微慢一些:

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

你能给出一个小输入和期望输出的例子吗?当你说5维数组时,你是指形状为5的数组吗?我刚刚添加了一个输入和输出的例子。我希望这会有帮助。你能给出一个小输入和期望输出的例子吗?当你说5维数组时,你是指形状为5的数组吗?我刚刚添加了一个输入和输出的例子。我希望这有帮助。它不应该是axis=1和no.t吗?@filippo确实如此。谢谢。它不应该是axis=1和no.t吗?@filippo确实如此。谢谢