Python函数返回二维numpy数组中异常值的索引
有没有一种方法可以用Python编写一个函数,在其中读取numpy二维数组,查找任何异常值的索引值,然后返回一个包含这些索引值的数组 这就是我目前所拥有的。我试着使用Z-score方法:Python函数返回二维numpy数组中异常值的索引,python,Python,有没有一种方法可以用Python编写一个函数,在其中读取numpy二维数组,查找任何异常值的索引值,然后返回一个包含这些索引值的数组 这就是我目前所拥有的。我试着使用Z-score方法: import numpy as np def function(arrayMatrix): threshold = 3 mean_y = np.mean(arrayMatrix) stdev_y = np.std(arrayMatrix) z_scores = [(y - me
import numpy as np
def function(arrayMatrix):
threshold = 3
mean_y = np.mean(arrayMatrix)
stdev_y = np.std(arrayMatrix)
z_scores = [(y - mean_y) / stdev_y for y in arrayMatrix]
return np.where(np.abs(z_scores) > threshold)
def main():
MatrixOne = np.array([[1,2,10],[1,10,2]])
print(function(MatrixOne))
MatrixTwo = np.array([[1,2,3,4,20],[1,20,2,3,4],[20,2,3,4,5]])
print(function(MatrixTwo))
main()
结果将是:
[2 1]
[4 1 0]
我的结果是:
(array([], dtype=int32), array([], dtype=int32))
(array([], dtype=int32), array([], dtype=int32))
你问了一个很好的问题。您可以使用python使用删除异常值的四分位数范围(IQR)方法 检查此代码。您可以调整名为
outlierConstant
的变量,以增加(或减少)对异常值的容忍度。我选择了outlierConstant=0.5
作为我在这里给出的示例
import numpy as np
# iqr is a function which returns indices of outliers in each row/1d array
def iqr(a, outlierConstant):
"""
a : numpy.ndarray (array from which outliers have to be removed.)
outlierConstant : (scale factor around interquartile region.)
"""
num = a.shape[0]
upper_quartile = np.percentile(a, 75)
lower_quartile = np.percentile(a, 25)
IQR = (upper_quartile - lower_quartile) * outlierConstant
quartileSet = (lower_quartile - IQR, upper_quartile + IQR)
outlier_indx = []
for i in range(num):
if a[i] >= quartileSet[0] and a[i] <= quartileSet[1]: pass
else: outlier_indx += [i]
return outlier_indx
def function(arr):
lst = []
for i in range(arr.shape[0]):
lst += iqr(a = arr[i,:], outlierConstant=0.5)
return lst
def main():
MatrixOne = np.array([[1,2,10],[1,10,2]])
print(function(MatrixOne))
MatrixTwo = np.array([[1,2,3,4,20],[1,20,2,3,4],[20,2,3,4,5]])
print(function(MatrixTwo))
main()
离群值是一组测量值,与平均值的偏差超过两个标准偏差,与平均值的偏差超过三个标准偏差。 在您的例子中,您可以将通过标准偏差的差值定义为异常值 试试这个:
import numpy as np
def main():
MatrixOne = np.array([[1,2,10],[1,10,2]])
print(function(MatrixOne))
MatrixTwo = np.array([[1,2,3,4,20],[1,20,2,3,4],[20,2,3,4,5]])
print(function(MatrixTwo))
MatrixThree = np.array([[1,10,2,8,5],[2,7,3,9,11],[19,2,1,1,5]])
print(function(MatrixThree))
def function(arrayMatrix):
arraystd=np.std(arrayMatrix,1,ddof=1,keepdims=True)
arraymean=np.mean(arrayMatrix,1)[:, np.newaxis]
arrayoutlier=np.transpose(np.where(np.abs(arrayMatrix-arraymean)>(arraystd)))#or 2*arraystd)
return arrayoutlier
main()
输出:
[[0 2]
[1 1]]
[[0 4]
[1 1]
[2 0]]
[[0 0]
[0 1]
[1 0]
[1 4]
[2 0]]
程序返回的索引是维度坐标。您的数学很好(尽管您需要设置threshold=1
,以获得所需的结果),但使用Numpy数组有点困难。以下是如何修复代码:
import numpy as np
def function(arrayMatrix, threshold=1):
zscore = (arrayMatrix - arrayMatrix.mean())/arrayMatrix.std()
return np.where(np.abs(zscore) > threshold)
def main():
MatrixOne = np.array([[1,2,10],[1,10,2]])
print(function(MatrixOne))
MatrixTwo = np.array([[1,2,3,4,20],[1,20,2,3,4],[20,2,3,4,5]])
print(function(MatrixTwo))
MatrixThree = np.array([[1,10,2,8,5],[2,7,3,9,11],[19,2,1,1,5]])
print(function(MatrixThree))
main()
这将产生:
(array([0, 1]), array([2, 1]))
(array([0, 1, 2]), array([4, 1, 0]))
(array([1, 2]), array([4, 0]))
其中,每行中的第一个数组是异常值的行索引,第二个数组是列索引。例如,输出中的第一行告诉您MatrixOne
中的异常值位于:
outliers = [MatrixOne[0,2], MatrixOne[1,1]]
上述解决方案适用于这两个矩阵。但是现在,当我在同一个函数中尝试这个新矩阵时,第三个结果似乎不太正确:MatrixThree=np.array([[1,10,2,8,5],[2,7,3,9,11],[19,2,1,1,1,5]))结果应该是[1 0 0],但我得到的结果是[0 1 0 4 0]维度中是否只有一个异常值?亲爱的Kardinol,我希望你发现下面给出的答案很有帮助。请接受给出的众多答案中的一个。=)
outliers = [MatrixOne[0,2], MatrixOne[1,1]]