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