标准化数组的切片

2024-04-20 00:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个3列数组。数组的第一列的值介于1和10之间。我需要提取第一列为1的所有行,并规范化这个数组切片的第三列。然后对第一列等于2的所有行重复相同的操作,以此类推

如果我运行此代码,它将保持数组不变:

for u in np.unique(x[:,0]):
    mask= x[:, 0] == u
    x[mask][:,2]=x[mask][:,2]/np.sum((x[mask][:,2]))

如果我运行另一段代码,我会看到r(我在循环中放置了一个print r)实际上完全符合我的要求。唯一的一点是原始数组x没有改变。你知道吗

for u in np.unique(x[:,0]):
    r = x[x[:, 0] == u]
    r[:,2]=r[:,2]/np.sum((x[x[:,0]==u][:,2]))

为什么?我做错什么了???你知道吗


Tags: 代码infornp切片mask数组规范化
2条回答

不要索引两次。显然,这样就创建了源数组的副本。 使用x[mask,2]而不是x[mask][:,2]

for u in np.unique(x[:,0]):
    mask= x[:, 0] == u
    x[mask,2]=x[mask,2]/np.sum((x[mask,2]))

下面是另一种考虑性能的矢量化方法,可以使用^{}^{}来解决问题-

tags = np.unique(x[:,0], return_inverse=1)[1]
x[:,2] /= np.bincount(tags, x[:,2])[tags]

为了进一步提高性能,可以避免使用np.unique并直接计算np.bincount(tags, xc[:,2])的等价物,同时利用第一列中的数字介于110之间的事实-

np.bincount(xc[:,0].astype(int), xc[:,2], minlength=11)[1:]

要替换tags,我们可以使用第一列,如下所示-

tags = xc[:,0].astype(int)-1

相关问题 更多 >