#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. вау, спасибо! я не думал делать это таким образом. я попробую адаптировать это к своему коду — большое вам спасибо!