Ищете способ настроить значения одного массива на основе другого массива?

#python #arrays #numpy #indexing

#python #массивы #numpy #индексирование

Вопрос:

Я начал с набора двумерных данных. Моя цель — сначала найти точки в том наборе данных, для которых значения y являются выбросами. Затем я хотел создать новый набор данных, который включал бы не только точки выбросов, но и любые точки со значением x в пределах 0,01 от любой заданной точки выбросов.

Затем (если возможно) Я хочу вычесть исходные значения x-выбросов из нового набора x, чтобы у меня была группа точек со значениями x от -0.01 до 0.01, при этом значение x теперь указывает расстояние от исходного значения x-выбросов.

У меня есть этот код:

 import numpy as np

mean = np.mean(y)
SD = np.std(y)

x_indices = [i for i in range(len(y)) if ((y[i]) > ((2*SD) mean))]

expanded_indices = [i for i in range(len(x)) if np.any((abs(x[i] - x[x_indices])) < 0.01)]
  

Это отлично сработало, и теперь я могу вызывать (и отображать) x и y, используя индексы:

 plt.plot(x[expanded_indices],y[expanded_indices])
  

Однако я понятия не имею, как вычесть исходные значения «x_indices», чтобы получить диапазон x от -0.01 до 0.01, поскольку все, что я пробовал, не удалось.

Я хочу сделать что-то вроде того, что у меня есть ниже, за исключением того, что я знаю, что не могу вычесть два массива разных размеров, и я беспокоюсь, что не смогу использовать np.any в этом контексте.

 x_values = [(x[expanded_indices] - x[indices]) if np.any((abs(x[expanded_indices] - x[indices])) < 0.01)]
  

Есть идеи? Извините, что это так долго — я очень новичок в этом и довольно потерян. Я пробовал последние несколько часов, и буду признателен за любую помощь. Спасибо!

примерные данные могут быть следующими: x =[0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106]

y = [1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5]

Комментарии:

1. Можете ли вы добавить примеры данных, чтобы мы могли поиграть с использованием данного кода?

2. Конечно — я попытаюсь выяснить, как это сделать сейчас.

3. Надеюсь, я добавил его в подходящем формате? Реальные данные, с которыми я работаю, находятся в большом файле .npz, и я подумал, что вам, ребята, будет проще, если я создам поддельные данные?

4. вы действительно должны просто начать с чтения учебника numpy, мой друг

5. Сложность в том, что в пределах x-расстояния 0,01 может быть несколько выбросов. Итак, вам нужно решить, какой выброс вы хотите вычесть. Любое расстояние? Или минимальное расстояние, или максимальное, или среднее?

Ответ №1:

Как только у вас есть набор со значениями y-выбросов и набор с расширенными значениями, вы можете просмотреть весь второй набор с помощью цикла for и вычесть соответствующее значение 1-го набора, используя 2 For() цикла:

 import numpy as np

x =np.array([0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106])
y = np.array([1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5])
mean = np.mean(y)
SD = np.std(y)
# elements with y-element outside defined region
indices = [i for i in range(len(y)) if ((y[i]) > ((2*SD) mean))]
my_1st_set = x[indices]
# Set with values within 0.01 difference with 1st set points
expanded_indices = [i for i in range(len(x)) if np.any((abs(x[i] - x[x_indices])) < 0.01)]
my_2nd_set = x[expanded_indices]
# A final set with the subtracted values from the 2nd set
my_final_set = my_2nd_set
for i in range(my_final_set.size):
    for j in range(my_1st_set.size):
        if abs(my_final_set[i] - my_1st_set[j]) < 0.01:
            my_final_set[i] = x[i] - my_1st_set[j]
            break
  

my_final_set — это массив numpy с результирующими значениями вычитания исходных значений expanded_indices с их соответствующим значением первого набора

Комментарии:

1. спасибо вам за это и за ваше терпение! мне потребовалось некоторое время, чтобы адаптировать это к моему реальному набору данных, но это работает хорошо, и я действительно очень ценю это!

2. Я рад, что это было полезно. Примите во внимание также совет, который пользователь прокомментировал в исходном сообщении о конфликтах, когда условие выполняется более чем в одном значении.

Ответ №2:

Давайте посмотрим, правильно ли я вас понял. Этот код должен находить выбросы и помещать массив в res для каждого выброса.

 import numpy as np

mean = np.mean(y)
SD = np.std(y)

x = np.array([0,0.994,0.995,0.996,0.997,0.998,1.134,1.245,1.459,1.499,1.500,1.501,2.103,2.104,2.105,2.106])
y = np.array([1.5,1.6,1.5,1.6,10,1.5,1.5,1.5,1.6,1.6,1.5,1.6,1.5,11,1.6,1.5])

outlier_indices = np.abs(y - mean) > 2*SD

res = []
for x_at_outlier in x[np.flatnonzero(outlier_indices)]:
    part_res = x[np.abs(x - x_at_outlier) < 0.01]
    part_res -= np.mean(part_res)
    res.append(part_res)
  

res теперь это список массивов, каждый из которых содержит значения около одного выброса. Возможно, проще продолжить работу с данными в этом формате?

Если вы хотите, чтобы все они были в одном массиве numpy:

 res = np.hstack(res)
  

Комментарии:

1. вау, спасибо! я не думал делать это таким образом. я попробую адаптировать это к своему коду — большое вам спасибо!