我有一个看起来像这样的numpy数组:
[[100, 1, 0.01, '5'], [50, 2, 0.02, '3'], [4000, 1, 0.01, '3']
我正在尝试做两件事:规范化3个第一列的数据,并删除3个第一列中具有异常值的行(以便保持第4列完整,作为字符串)。
我已经有了一个函数来规范我从这里获取的数据:Normalize numpy array columns in python
当我的一个数据是异常值时,我已经有了一个删除完整行的功能,我从这里取出:Removing outliers in each column (and corresponding row)
但是该函数正在规范所有列,我不希望它影响最后一列。所以我试着临时删除最后一列并以此方式将其放回去:
temp_col = np.take(a, [3], axis=1)
a = np.delete(a, [3], axis=1)
a = a.astype(np.float)
a = remove_outliers(a, 6)
a = normalize_data(a)
a = np.append(a, temp_col, axis=1) #wont work
这些是使用的方法(取自我上面提到的来源):
def normalize_data(a):
return a / a.max(axis=0)
def remove_outliers(self, a, m):
mask = np.ones((a.shape[0],), dtype=np.bool)
mu, sigma = np.mean(a, axis=0), np.std(a, axis=0, ddof=1)
for j in range(a.shape[1]):
col = a[:, j]
mask[mask] &= np.abs((col[mask] - mu[j]) / sigma[j]) < m
return a[mask]
但现在的问题是,当我删除异常值行时,我的临时列的长度不再与数组大小匹配,所以我无法追回它。
有没有人能解决这个问题?我应该这么做,并保存因异常值而删除的行的索引,然后在temp_col中将其删除?
非常感谢!