найти индекс наибольшего отличия от медианы с NumPy - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь найти номер индекса номера выброса.основываясь на отличии от медианы, я могу получить правильное старшее число, но всякий раз, когда младшее число является выбросом, я получаю только старшее число ..

import numpy as np

def findoutlier(lis):

  outliermax = np.absolute(np.max(lis) - np.median(lis))
  outliermin = np.absolute(np.min(lis) - np.median(lis))
  if outliermax > outliermin:
     argmax = np.argmax(lis, axis = 1)
     return argmax
  else:
     argmin = np.argmin(lis, axis = 1)
     return argmin

def main():
  Matx = np.array([[10,3,2],[1,2,6]])   
  print(findoutlier(Matx))

  threeMatx = np.array([[1,10,2,8,5],[2,7,3,9,11],[19,2,1,1,5]])
  print(findoutlier(threeMatx))

main()

1 Ответ

0 голосов
/ 13 ноября 2018

Вам необходимо указать ось при использовании медианы, макс и мин:

import numpy as np


def findoutlier(lis):
    omaxs = np.absolute(np.max(lis, axis=1) - np.median(lis, axis=1))
    omins = np.absolute(np.min(lis, axis=1) - np.median(lis, axis=1))

    return [np.argmax(l) if omax > omin else np.argmin(l)  for omax, omin, l in  zip(omaxs, omins, lis)]


def main():
    mat_x = np.array([[10, 3, 2], [1, 2, 6]])
    print(findoutlier(mat_x))

    three_mat_x = np.array([[1, 10, 2, 8, 5], [2, 7, 3, 9, 11], [19, 2, 1, 1, 5]])
    print(findoutlier(three_mat_x))

выход

[0, 2]
[1, 0, 0]

UPDATE

Как уже упоминалось @ user3483203, вы можете использовать numpy.where :

import numpy as np


def findoutlier(lis):
    omaxs = np.absolute(np.max(lis, axis=1) - np.median(lis, axis=1))
    omins = np.absolute(np.min(lis, axis=1) - np.median(lis, axis=1))

    return np.where(omaxs > omins, np.argmax(lis, axis=1), np.argmin(lis, axis=1))


def main():
    mat_x = np.array([[10, 3, 2], [1, 2, 6]])
    print(findoutlier(mat_x))

    three_mat_x = np.array([[1, 10, 2, 8, 5], [2, 7, 3, 9, 11], [19, 2, 1, 1, 5]])
    print(findoutlier(three_mat_x))

main()

выход

[0 2]
[1 0 0]
...