Биннинг данных и вычисление MAE для каждого бункера в Python

У меня есть два массива:

Obs=([])
abs_error=([])

Я хочу использовать Obs для определения бункеров. Например, где Obs от 1 до 2, bin abs_error в bin # 1. Затем, где Obs равно от 2 до 3, bin abs_error в bin # 2. и Т. Д.

После того, как у меня есть свой бункер abs_error (который был объединен Obs), я хочу вычислить среднее значение каждого бункера, а затем построить среднее значение каждого бункера по оси Y против ячеек по оси x.

Как мне объединить abs_error с помощью ящиков, определенных в Obs? И как мне вычислить среднее значение для каждого бункера после того, как это будет сделано?

Прямо сейчас у меня есть:

abs_error=np.array([2.214033842086792 2.65031099319458 2.021354913711548 ... 2.831442356109619 1.9227538108825684 0.19358205795288086])
obs=np.array([3.3399999141693115 1.440000057220459 1.2799999713897705 ... 5.78000020980835 6.050000190734863 7.75])
bin_boundaries=np.array([0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0])

idx = np.digitize(obs, bin_boundaries)
mn_ = np.bincount(idx,abs_error) / np.bincount(idx)
print mn

[83.09254473  3.18577858  2.82887524  2.78532805  2.43264693  1.96835116 1.77645996  1.66138196  1.5972414   1.57512014  1.53094066  1.7965252 1.98050336  2.29916244  3.06640482  4.66769505  3.16787195]

Я не могу распечатать массивы целиком, потому что они очень большие.


person HM14    schedule 27.03.2019    source источник


Ответы (1)


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

idx = (Obs // 1).astype(int)

Если нет, используйте вместо этого np.digitize.

idx = np.digitize(Obs, bin_boundaries)

Если у вас есть индексы, используйте их с np.bincount, чтобы получить средства.

mn = np.bincount(idx, abs_error) / np.bincount(idx)
person Paul Panzer    schedule 27.03.2019
comment
Думаю, я, должно быть, делаю что-то не так. Я получаю странное число для среднего значения первой корзины. Я отредактировал свой вопрос выше, чтобы включить код в ваш обновленный ответ. Я получаю среднее значение 83 для первого бункера, чего не может быть, потому что максимальное значение для obs равно 17, а максимальное значение для abs_error равно 13. поэтому я не понимаю, как средства в любом из бункеров могут превышать это . Вы можете сказать, что я делаю не так? - person HM14; 01.04.2019
comment
Игнорируйте мой предыдущий комментарий. Оказывается, у меня были какие-то наны в массиве, которые испортили результаты. Я замаскировал массивы там, где есть наны, и, похоже, это решило мою проблему. Однако, если я получаю nans в верхней части моего массива, означает ли это, что в этих ячейках нет счетчика? например, я получаю mn = [нан 3,18577858 2,82887524 ...... 1,57512014 1,53094066 1,7965252 1,98050336 2,29916244 3,06640482 4,66769505 3,16787195 нан нан нан нан нан нан] и для двоичного числа (idx) = [0 157 458 677 855 920 979 ..... .. 4 2 2 0 0 0 0 0 3133] - person HM14; 01.04.2019
comment
@ HM14 Да, среднее значение пустой корзины не определено, поэтому NaN - подходящий ответ. Технически происходит 0 / 0, где первый ноль - это сумма, а второй ноль - это количество элементов. - person Paul Panzer; 01.04.2019