python - 将带有值的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 数组中所需的输出。
解决方案
这是 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]
推荐阅读
- python - join操作后如何避免重复列?
- hyperledger-fabric - Composer 网络的 Hyperledger Caliper 教程
- c# - 如何在所需位置将pdf页面添加到现有pdf而不是在顶部添加?
- javascript - 如何在forEach循环Angular 6中进行同步调用
- events - UWP 中何时调用 MediaStreamSource.SampleRequested 回调方法?
- python - 根据动态值多次附加整数以在for循环中列出
- kotlin - 在 kotlin 中使用 map 函数
- azure - https Kubernetes 部署的应用程序
- reactjs - 如何使用循环构建一个带有 in react 的句子?
- php - 无法从 Firebase 发送推送通知