规范化ndarray的切片

时间:2017-04-14 16:47:23

标签: python numpy multidimensional-array

我有一个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(我在循环中放置了一个打印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]))

为什么?我做错了什么???

2 个答案:

答案 0 :(得分:1)

不要指数两次。显然,然后创建了源数组的副本。 使用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]))

[{"matId":"1","value":"44"},{"matId":"2","value":"55"},{"matId":"4","value":"77"}]

答案 1 :(得分:1)

这是一种替代的矢量化方法,在使用np.uniquenp.bincount来解决问题时考虑了性能 -

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

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

10

要替换np.bincount(xc[:,0].astype(int), xc[:,2], minlength=11)[1:] ,我们可以使用第一列,如此 -

tags