У меня есть два измерения, положение и температура, которые отбираются с фиксированной частотой дискретизации. Некоторые позиции могут возникать несколько раз в данных. Теперь я хочу построить температуру над положением, а не по времени. Вместо того, чтобы отображать две точки в одном и том же положении, я хочу заменить измерения температуры на среднее значение для данного местоположения. Как это можно сделать красиво в python с numpy?Python Numpy: Заменить повторяющиеся значения со средним значением
Мое решение до сих пор выглядит следующим образом:
import matplotlib.pyplot as plt
import numpy as np
# x = Position Data
# y = Temperature Data
x = np.random.permutation([0, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9])
y = (x + np.random.rand(len(x)) * 1 - 0.5).round(2)
# Get correct order
idx = np.argsort(x)
x, y = x[idx], y[idx]
plt.plot(x, y) # Plot with multiple points at same location
# Calculate means for dupplicates
new_x = []
new_y = []
skip_next = False
for idx in range(len(x)):
if skip_next:
skip_next = False
continue
if idx < len(x)-1 and x[idx] == x[idx+1]:
new_x.append(x[idx])
new_y.append((y[idx] + y[idx+1])/2)
skip_next = True
else:
new_x.append(x[idx])
new_y.append(y[idx])
skip_next = False
x, y = np.array(new_x), np.array(new_y)
plt.plot(x, y) # Plots desired output
Это решение не принимать во внимание, что некоторые позиции могут occoure более чем в два раза в данных. Чтобы заменить все значения, цикл должен запускаться несколько раз. Я знаю, что должно быть лучшее решение!
Выглядит хорошо и дает тот же точный результат - мое решение! Давайте посмотрим, если кто-то еще придумает другое хорошее решение, в противном случае я пойду и соглашусь с этим. – jrast
@jrast Конечно! Не спешите. Просто любопытство в этом - Вы видите ускорение с таким подходом, если бы у вас была возможность сравниться? Я ожидаю хотя бы некоторого ускорения с этим. – Divakar
Я просто сравнил его с решением @Will: я использовал набор данных с 300000 точками данных, каждый из которых занимает 3 раза (так что 100000 уникальных позиций.) Ваше решение: 10 циклов, лучше всего 3: 20,6 мс за цикл, Уилл Решение: 1 петля, лучше всего 3: 2,16 с за цикл. Я думаю, что мое оригинальное решение будет в том же диапазоне, что и Уилл, поскольку он также использует циклы. – jrast