Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标准化数据数组的切片_Python_Numpy_Multidimensional Array - Fatal编程技术网

Python 标准化数据数组的切片

Python 标准化数据数组的切片,python,numpy,multidimensional-array,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(我在循环中放置了一个print r)实际上完全按照我想

我有一个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]))

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

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

这里有一种考虑性能的矢量化方法,可以使用和解决您的问题-

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

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

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